实现蘑菇街首页效果

打算出一个系列,专治现在市面上各种app的各种滑动不服系列,解决各种滑动冲突问题,现在已经发现了9种样式,打算一个一个一一破解,这是第一篇。

今天给大家带来的是高仿蘑菇街的首页,现在这种页面的格式很流行,一般都用在首页上,能够很好的利用手机屏幕的空间,毕竟手机屏幕就这么一点点大,想要放很多东西呢,这种布局方式还是很不错的。

先看一下效果:点击打开链接

说一下思路:其实思路很简单,把所有控件都包括进一个自定义ViewGroup里,可以继承自ScrollView,也可以继承自LinearLayout,这里我选择LinearLayout,布局上减少了一层层级,性能上显得更加优秀。然后既然自定了ViewGroup,我们就需要对滑动进行事件分发,这里我们只要对y方向的滑动进行判断就可以了,横向的并不冲突。怎么dispatch呢?看一下下面的图示:当滑动距离达到view1+view2的高度之前,自定义viewGroup(在这里我取名为MoguLayout,不知道应该取什么名字比较好)对滑动事件进行拦截,滑动事件自己处理,当view1+view2都隐藏了以后,且用户是继续向上滑动的时候MoguLayout放过,不拦截,滑动事件留给ListVIew自己处理,当view1+view2隐藏,且listview的第一个item到顶部且用户向下滑动到时候,这个时候MoguLayout又要拦截了。

ok,思路分析得也差不多了,直接上代码:

第一步,就是总体框架的搭建,主要就是Fragment和ViewPager,这里先贴出Fragment的代码;

 

public class ListFragment extends Fragment{private static final int LIST_NUM = 20;private View view;@ViewInject(R.id.id_listview)private ListView listView;private int type;private List<String> stringList = new ArrayList<>();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Bundle bundle = getArguments();if (bundle != null){type = bundle.getInt("type");}}@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {view = inflater.inflate(R.layout.layout_fragment,null);ViewUtils.inject(this,view);ViewGroup parent = (ViewGroup) view.getParent();if (parent != null){parent.removeView(view);}initData();initListView();return view;}private void initData() {stringList.clear();for (int i = 0;i < LIST_NUM;i++){stringList.add("列表"+type+":"+i);}}private void initListView() {listView.setAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,stringList));}
}

 

第二步,就是先把界面都弄出来,activity_main和MainActivity代码如下:

 

<com.jiangjieqiang.mogulayout.view.MoguLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><RelativeLayoutandroid:id="@id/id_top_banner"android:layout_width="match_parent"android:layout_height="200dp"android:background="@color/lightpink"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:text="轮播图"android:layout_centerInParent="true"/></RelativeLayout><!--<RelativeLayout--><!--android:id="@id/id_horizontalview"--><!--android:layout_width="match_parent"--><!--android:layout_height="100dp"--><!--android:background="@color/blue">--><!--</RelativeLayout>--><HorizontalScrollViewandroid:id="@id/id_horizontalview"android:layout_width="match_parent"android:layout_height="100dp"android:scrollbars="none"><LinearLayoutandroid:id="@+id/id_horizontalview_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"></LinearLayout></HorizontalScrollView><com.jiangjieqiang.mogulayout.view.AutoHorizontalScrollViewandroid:id="@id/id_horizontalmenu"android:layout_width="match_parent"android:layout_height="50dp"android:background="@color/white"android:layout_gravity="center"android:scrollbars="none"><LinearLayoutandroid:id="@+id/tab_layout"android:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"></LinearLayout></com.jiangjieqiang.mogulayout.view.AutoHorizontalScrollView><android.support.v4.view.ViewPagerandroid:background="@color/green"android:id="@id/id_viewpager"android:layout_width="match_parent"android:layout_height="wrap_content"/></com.jiangjieqiang.mogulayout.view.MoguLayout>

 

 

 

MainActivity:

 

public class MainActivity extends AppCompatActivity {private static final int NUM_FRAGMENT = 10;@ViewInject(R.id.id_viewpager)private ViewPager viewPager;@ViewInject(R.id.id_horizontalmenu)private AutoHorizontalScrollView menu;@ViewInject(R.id.tab_layout)private LinearLayout tabLayouts;@ViewInject(R.id.id_horizontalview_layout)private LinearLayout typeLayouts;private List<ListFragment> fragmentList = new ArrayList<>();private List<String> titles = new ArrayList<>();private List<TextView> textViews = new ArrayList<>();private List<ItemVO> itemList = new ArrayList<>();private String[] typeTitles = {"李易峰专区","当剩女遇见桃花","春季遮肉必看","甜心开胃菜","租男友","开学衣橱大改造","没有PS你可以吗","藏肉显瘦搭配"};private int[] typeImgs = {R.mipmap.icon1,R.mipmap.icon1,R.mipmap.icon1,R.mipmap.icon1,R.mipmap.icon1,R.mipmap.icon1,R.mipmap.icon1,R.mipmap.icon1};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewUtils.inject(this);initFragments();initView();initTypeLayout();}private void initFragments() {for (int i = 0;i < NUM_FRAGMENT;i++){titles.add("title"+i);ListFragment fragment = new ListFragment();Bundle bundle = new Bundle();bundle.putInt("type",i);fragment.setArguments(bundle);fragmentList.add(fragment);LinearLayout tabLayout = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.menu_item,null);final TextView textView = (TextView)tabLayout.findViewById(R.id.tab_tv);textView.setText(titles.get(i));final int id = i;tabLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {setSelector(id);}});tabLayouts.addView(tabLayout);textViews.add(textView);}}private void initView() {setSelector(0);viewPager.setCurrentItem(0);viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {setSelector(position);}@Overridepublic void onPageScrollStateChanged(int state) {}});viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {@Overridepublic int getCount() {return NUM_FRAGMENT;}@Overridepublic Fragment getItem(int position) {return fragmentList.get(position);}});}/*** 选中效果* @param position*/private void setSelector(final int position) {for (int i = 0;i < NUM_FRAGMENT; i++){if (position == i){viewPager.setCurrentItem(position);menu.resetScrollWidth(position);textViews.get(i).setBackgroundResource(R.mipmap.bg_nav_contacts);}else {textViews.get(i).setBackgroundResource(R.color.alpha);}}}/*** 初始化横向滑动的layouts*/private void initTypeLayout() {initItemList();for (final ItemVO itemVO : itemList){FrameLayout tabLayout = (FrameLayout)LayoutInflater.from(this).inflate(R.layout.horizontal_item,null);ImageView imageView = (ImageView)tabLayout.findViewById(R.id.id_horizontal_item_img);TextView textView = (TextView)tabLayout.findViewById(R.id.id_horizontal_item_desc);imageView.setImageResource(itemVO.getImage());imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);textView.setText(itemVO.getDesc());tabLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//intent进入其他页面//……Toast.makeText(MainActivity.this, "进入页面", Toast.LENGTH_SHORT).show();}});LinearLayout.LayoutParams vlp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);vlp.setMargins(calculateDpToPx(5),calculateDpToPx(5),calculateDpToPx(5),calculateDpToPx(5));typeLayouts.addView(tabLayout,vlp);}}private void initItemList() {itemList.clear();for (int i = 0;i < typeImgs.length;i ++){ItemVO itemVO = new ItemVO(typeTitles[i],typeImgs[i]);itemList.add(itemVO);}}private int calculateDpToPx(int padding_in_dp){final float scale = getResources().getDisplayMetrics().density;return  (int) (padding_in_dp * scale + 0.5f);}}

其中我对listview的导航进行了自定义view的处理,其实我就是在其中公开了一个方法,给MainActivity里的viewPager当滑动到页面的时候调用:

 

AutoHorizontalScrollView:

 

public class AutoHorizontalScrollView extends HorizontalScrollView{public AutoHorizontalScrollView(Context context) {super(context);}public AutoHorizontalScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public AutoHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}/*** 当item过多时,主屏幕显示不了,就重置item的width的位置,并让下一个item显示在屏幕的一半* @param index*/public void resetScrollWidth(int index) {ViewGroup parent = (ViewGroup) getChildAt(0);if (index < 0 || index >= parent.getChildCount()) {return;}View view;int left = 0;for (int i = 0; i < index; i++) {view = parent.getChildAt(i);view.measure(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);left += view.getMeasuredWidth();}view = parent.getChildAt(index);view.measure(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);int right = left + view.getMeasuredWidth();if (right < getWidth()/ 2) {this.smoothScrollTo(0, 0);}else {this.smoothScrollTo(right - (getWidth()/ 2), 0);}}
}

 

3、重头戏,也就是重点MoguLayout的实现;

 

首先,就是对一些我们要使用到的变量进行定义以及初始化,然后呢我们有viewpager,viewpager是不会自己去测量里面孩子的高度的,我们需要在onMeasure()方法里给它设置一个高度。

public class MoguLayout extends LinearLayout{private View topView;private View horizontalScrollView;private AutoHorizontalScrollView menu;private ViewPager viewPager;private ListView listView;private OverScroller scroller;private VelocityTracker mVelocityTracker;private int mTouchSlop;private int mMaximumVelocity, mMinimumVelocity;private int distanceFromViewPagerToX;private float mLastY;private boolean mDragging;private boolean isInControl = false;private boolean isTopHidden = false;public MoguLayout(Context context, AttributeSet attrs) {super(context, attrs);setOrientation(LinearLayout.VERTICAL);scroller = new OverScroller(context);mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();mMaximumVelocity = ViewConfiguration.get(context).getScaledMaximumFlingVelocity();mMinimumVelocity = ViewConfiguration.get(context).getScaledMinimumFlingVelocity();}@Overrideprotected void onFinishInflate() {super.onFinishInflate();topView = findViewById(R.id.id_top_banner);horizontalScrollView = findViewById(R.id.id_horizontalview);viewPager = (ViewPager)findViewById(R.id.id_viewpager);menu = (AutoHorizontalScrollView)findViewById(R.id.id_horizontalmenu);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);ViewGroup.LayoutParams params = viewPager.getLayoutParams();params.height = getMeasuredHeight() - menu.getMeasuredHeight();}

 

 

 

然后,我们需要随时获取view1+view2在屏幕上显示的高度,这个高度我们要用来进行对滑动事件是否拦截的判断。

 

@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);distanceFromViewPagerToX = topView.getMeasuredHeight()+horizontalScrollView.getMeasuredHeight();}


之后就是三部曲了:1、自定了viewGroup,滑动就要自己写,2、dispatchTouchEvent()进行分发,3、onInterceptTouchEvent()进行拦截判断,具体的逻辑分析之前已经分析过了,那就上代码咯:

 

 

@Overridepublic boolean onTouchEvent(MotionEvent event) {initVelocityTrackerIfNotExists();mVelocityTracker.addMovement(event);int action = event.getAction();float y = event.getY();switch (action) {case MotionEvent.ACTION_DOWN:if (!scroller.isFinished())scroller.abortAnimation();mLastY = y;return true;case MotionEvent.ACTION_MOVE:float dy = y - mLastY;//判断是滑动还是点击if (!mDragging && Math.abs(dy) > mTouchSlop) {mDragging = true;}if (mDragging) {scrollBy(0, (int) -dy);// 如果topView隐藏,且上滑动时,则改变当前事件为ACTION_DOWNif (getScrollY() == distanceFromViewPagerToX && dy < 0) {event.setAction(MotionEvent.ACTION_DOWN);dispatchTouchEvent(event);isInControl = false;}}mLastY = y;break;case MotionEvent.ACTION_CANCEL:mDragging = false;recycleVelocityTracker();if (!scroller.isFinished()) {scroller.abortAnimation();}break;case MotionEvent.ACTION_UP:mDragging = false;//初始化mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);int velocityY = (int) mVelocityTracker.getYVelocity();if (Math.abs(velocityY) > mMinimumVelocity) {fling(-velocityY);}recycleVelocityTracker();break;}return super.onTouchEvent(event);}/*** 当滑动速度比较大的时候,实现快速滑动* @param velocityY*/public void fling(int velocityY) {//scroller.fling(0, getScrollY(), 0, velocityY, 0, 0, 0, distanceFromViewPagerToX);invalidate();}@Overridepublic void scrollTo(int x, int y) {if (y < 0) {y = 0;}if (y > distanceFromViewPagerToX) {y = distanceFromViewPagerToX;}if (y != getScrollY()) {super.scrollTo(x, y);}isTopHidden = getScrollY() == distanceFromViewPagerToX;}@Overridepublic void computeScroll() {if (scroller.computeScrollOffset()) {scrollTo(0, scroller.getCurrY());invalidate();}}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {int action = ev.getAction();float y = ev.getY();switch (action) {case MotionEvent.ACTION_DOWN:mLastY = y;break;case MotionEvent.ACTION_MOVE:float dy = y - mLastY;getCurrentListView();View view = listView.getChildAt(listView.getFirstVisiblePosition());if (!isInControl && view != null && view.getTop() == 0 && isTopHidden && dy > 0) {isInControl = true;ev.setAction(MotionEvent.ACTION_CANCEL);MotionEvent ev2 = MotionEvent.obtain(ev);dispatchTouchEvent(ev);ev2.setAction(MotionEvent.ACTION_DOWN);return dispatchTouchEvent(ev2);}break;}return super.dispatchTouchEvent(ev);}private void getCurrentListView() {int currentItem = viewPager.getCurrentItem();PagerAdapter a = viewPager.getAdapter();FragmentPagerAdapter fadapter = (FragmentPagerAdapter) a;Fragment item = (Fragment) fadapter.instantiateItem(viewPager,currentItem);listView = (ListView) (item.getView().findViewById(R.id.id_listview));}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {final int action = ev.getAction();float y = ev.getY();switch (action) {case MotionEvent.ACTION_DOWN:mLastY = y;break;case MotionEvent.ACTION_MOVE:float dy = y - mLastY;getCurrentListView();if (Math.abs(dy) > mTouchSlop) {//滑动mDragging = true;View view = listView.getChildAt(listView.getFirstVisiblePosition());// 拦截条件:topView没有隐藏// 或listView在顶部 && topView隐藏 && 下拉if (!isTopHidden || (view != null && view.getTop() == 0 && isTopHidden && dy > 0)) {initVelocityTrackerIfNotExists();mLastY = y;mVelocityTracker.addMovement(ev);return true;}}break;case MotionEvent.ACTION_CANCEL:case MotionEvent.ACTION_UP:mDragging = false;recycleVelocityTracker();break;}return super.onInterceptTouchEvent(ev);}private void initVelocityTrackerIfNotExists() {if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();}}private void recycleVelocityTracker() {if (mVelocityTracker != null) {mVelocityTracker.recycle();mVelocityTracker = null;}}

 

这里我们对快速滑动进行了特殊处理,当滑动速度大于minVelocityTracker的时候,我们处理的圆润一点,直接滑动到view1+view显示或者隐藏两种状态。ok,基本就大功告成了!

 

项目地址:点击打开链接

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352224.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

设备指纹系列--基础篇

基础概念 618还没开始&#xff0c;但是又好像已经结束了…在这种电商大促的大节日前&#xff0c;电商行业客户一般会提前找到合适的设备指纹产品&#xff0c;去防止被“薅秃”。因为&#xff0c;黑灰产拥有专业的设备牧场&#xff0c;通过使用模拟器、刷机改机等手段&#xff…

仿蘑菇街个人主页

效果图&#xff1a; 看到效果图&#xff0c;第一想到的大致布局是一个scrollview嵌套一个viewpage&#xff0c;viewpage里面有一两个fragment或者写成一个fragment。但是fragment肯定包含两个布局&#xff0c;一个是含有图片(gridview)的listview&#xff0c;另一个布局是只含有…

App竞品分析报告:美丽说VS蘑菇街

1.产品概况 iOS App Store中国区iPhone免费-生活类排名&#xff08;最近3个月&#xff09; 数据来源&#xff1a;ann9.com 蘑菇街排名基本稳定在Top 10至20之间&#xff0c;美丽说在8月下旬后基本游离在Top 30外。 2015年6月活跃用户数比对-iOS端 数据说明&#xff1a;MAU为月…

社会化购物:Pinterest,Fancy还是美丽说,蘑菇街?

转自&#xff1a;网站分析在中国 原文地址&#xff1a;http://www.chinawebanalytics.cn/social-shopping-pinterest-or-fancy/ 【每期一句】越强烈的网络效应&#xff0c;越接近成功。 【前言】这篇文章是应 的邀请所做。很高兴能有机会与几年前一样&#xff0c;分析一个细分行…

仿蘑菇街项目

引言 仿蘑菇街的Vue.js项目是我学习vue.js做的第一个项目&#xff0c;今天来重温一下项目实现的功能&#xff0c;记录一下&#xff0c;方便以后查看。首先需要创建项目&#xff0c;本项目采用cli-3脚手架创建项目&#xff0c;采用默认安装模式&#xff0c;没有安装vue-router和…

高仿蘑菇街欢迎页

####蘑菇街欢迎页 ####高仿效果 这里这里…Demo下载地址 #####前言 本文将介绍如何对蘑菇街欢迎页效果进行分析&#xff0c;拆分&#xff0c;并一步步实现1个高仿版本&#xff0c;最重要的设计思路包括以下2点&#xff1a; 1.ViewPager切换时&#xff0c;通过offset偏移量动…

美丽说蘑菇街首页效果(UITableView和UIScrollerView联动)

作为一名菜鸟iOS开发程序员&#xff0c;第一次写文章&#xff0c;有点小激动&#xff01;进入正题&#xff0c;最近项目中有个需求&#xff0c;类似美丽说蘑菇街首页效果&#xff0c;在网上找了一些资料后自己研究了下终于搞定了&#xff01; 先看效果&#xff1a; 接下来详细…

【Linux】Nginx 优化与防盗链

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Nginx 优化与防盗链 一、隐藏版本号方法一&#xff1a;修改配置文件方式方法二&#xff1a;修改源码文件&#xff0c;重新编译安装 二、修改用户与组三、缓存时间四、日志切割…

操作系统的最强入门科普(Unix/Linux篇)

今天这篇文章&#xff0c;我们来聊聊操作系统&#xff08;Operating System&#xff09;。 说到操作系统&#xff0c;大家都不会陌生。我们天天都在接触操作系统——用台式机或笔记本电脑&#xff0c;使用的是windows和macOS系统&#xff1b;用手机、平板电脑&#xff0c;则是a…

PDF文件无法编辑怎么办

PDF文件无法编辑是因为设置了编辑限制&#xff0c;只要在设置密码的地方输入密码把密码取消就可以自由编辑文件了。如果不知道密码或者忘记了密码&#xff0c;只能使用第三方的解密软件把密码解除掉&#xff0c;现在有很多PDF的辅助软件&#xff0c;可以在网上搜到很多&#xf…

SpringBoot实现服务器PDF文件的下载和预览功能

&#x1f345;程序员小王的博客&#xff1a;程序员小王的博客 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 如有编辑错误联系作者&#xff0c;如果有比较好的文章欢迎分享给我&#xff0c;我会取其精华去其糟粕 &#x1f345;java自学的学习…

PDF文件不能编辑,有什么办法能够解决?

PDF文件打开之后发现不能编辑&#xff0c;很有可能是因为PDF文件设置了限制编辑。一般来说&#xff0c;想要解决问题&#xff0c;我们只需要将PDF编辑限制解除就可以了 但是大家有时候可能是不知道PDF密码的&#xff0c;那么在不知道PDF密码的情况下&#xff0c;如何解决不能编…

java利用itext编辑pdf

最近项目需要,在调研如何在pdf中增加标识字样,用来区分版本.最后确定用itext来实现 . itext的官网是:http://www.itextpdf.com/ 代码如下: Java代码 /** * authory kingviker * time : 2012-12-12 */ import java.io.FileOutputStream; import java.io.IOExcepti…

java设置pdf不可编辑_禁止编辑,但允许在Java iText / PDF中进行页面提取

我正在使用iText生成PDF文件 . 我想禁止编辑PDF&#xff0c;但允许读者提取页面 . 这是我设置加密的代码&#xff1a; writer.setEncryption(null, null, 0xffffffff, PdfWriter.STANDARD_ENCRYPTION_128); 第三个参数指定权限 . 我正在使用0xffffffff而不是单独的iText标志ALL…

HTML5 PDF 编辑,pdf.js的使用与改造

一、前期准备 1.1 需求描述 1.想让各个浏览器能显示服务器存放的PDF文件(主要是手机的浏览器) 2.想让项目结构如下:lib目录存放pdf.js等依赖文件,src存放要显示的pdf文件 想要的项目结构 3.这样我就可以将这个项目放到我网站的任何目录下,比如放到PDF或者别的文件夹下 PDF目…

如何免费编辑PDF文档?

我们都知道PDF文档不像Word文档一样可以直接编辑修改&#xff0c;想要编辑PDF文档&#xff0c;我们就需要借助专业的PDF编辑器。今天小编就给大家推荐一款可以免费编辑PDF文档的工具“金闪PDF编辑器”。 金闪PDF编辑器是一款功能齐全的强大的PDF工具&#xff0c;目前有移动端安…

PDF文件编辑并去除水印

我相信很多博友肯定被这个问题烦恼过&#xff0c;并且当初我自己也因为这个事情熬的掉了好几根头发&#xff0c;这件事就是PDF文件编辑过后会留下很严重的水印&#xff0c;并且无法除去&#xff0c;想去除就得花钱购买会员&#xff0c;想白嫖都没有办法&#xff0c;接下来我就为…

怎么编辑PDF文件?分享三种好用的编辑方法

怎么编辑PDF文件中的内容呢&#xff1f;大家在日常使用PDF文件的过程中肯定遇到过需要编辑文件的需求&#xff0c;因为我们不能保证每个文件中的内容都不会出错&#xff0c;问题是PDF文件不容易改动&#xff0c;我们怎么做才能够编辑PDF文件呢&#xff1f;不用着急&#xff0c;…

如何编辑PDF文件?编辑PDF的方法有哪些?

PDF文件是一种广泛使用的文档格式&#xff0c;通常用于共享和阅读文档&#xff0c;如电子书、报告、合同等。但是&#xff0c;有时候您可能需要编辑PDF文件。编辑PDF文件可能听起来很困难&#xff0c;但是有许多方法可以轻松地编辑PDF文件。本文将探讨几种最常见的编辑PDF文件的…

PDF编辑:Adobe Acrobat X Pro 官方原版下载+中文汉化补丁

Adobe在10月份发布了新一代Acrobat X软件家族&#xff0c;其中包括PDF创建编辑软件Acrobat X Pro,因为Acrobat X Pro是Acrobat Pro 9.0的后续版本&#xff0c;故也有人称其为Acrobat Pro 10.0。虽然Aodbe Acrobat X Pro正式版发布许久了&#xff0c;但Acrobat X Pro 简体中文版…