如果您对android–在ViewPager中禁用动画和viewpager取消动画感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解android–在ViewPager中禁用动画的各种细节,并对v
如果您对android – 在ViewPager中禁用动画和viewpager取消动画感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解android – 在ViewPager中禁用动画的各种细节,并对viewpager取消动画进行深入的分析,此外还有关于Android App在ViewPager中使用Fragment的实例讲解、Android NestedScrollView 嵌套 ViewPager 以及 ViewPager 内嵌套 recyclerView 的问题、Android ViewPager嵌套ViewPager布局、Android ViewPager:更新ViewPager中的屏幕外缓存片段的实用技巧。
本文目录一览:- android – 在ViewPager中禁用动画(viewpager取消动画)
- Android App在ViewPager中使用Fragment的实例讲解
- Android NestedScrollView 嵌套 ViewPager 以及 ViewPager 内嵌套 recyclerView 的问题
- Android ViewPager嵌套ViewPager布局
- Android ViewPager:更新ViewPager中的屏幕外缓存片段
android – 在ViewPager中禁用动画(viewpager取消动画)
我想在自定义viewPager中禁用转换的所有动画.
此视图分页器包含四个选项卡 – 每个选项卡加载一个片段 – 以及视图分页器所做的是切换选项卡:例如,第一个选项卡是索引,第二个选项卡是地图等.
问题是,如果,作为第一个选项卡,我点击第四个选项卡,我可以看到ViewPager如何通过第二个和第三个选项卡,并在第四个选项卡上停止,我不希望这发生.
我尝试禁用此ViewPager的所有动画,尝试在每次用户选择要显示的新选项卡时使用setAnimation为null,但它仍然无效.
有什么想法实现这个,拜托?
非常感谢提前!
编辑:我也尝试覆盖每个片段的onCreateAnimation但仍然无法正常工作
解决方法:
我终于发现:只需调用带有额外参数的mViewPager.setCurrentItem(position)就可以解决问题,这是ViewPager的平滑滚动.
在此之后,滚动将在没有任何平滑的情况下完成,因此将不会看到动画.
Android App在ViewPager中使用Fragment的实例讲解
据说Android最推荐的是在ViewPager中使用FragMent,即ViewPager中的页面不像前面那样用LayoutInflater直接从布局文件加载,而是一个个Fragment。注意这里的Fragment
是android.support.v4.view包里的Fragment,而不是android.app包里的Fragment。
使用v4包里的Fragment的Activity必须继承自FragmentActivity。
其实使用Fragment与前面不使用Fragment非常类似:
第一步 在主布局文件里放一个ViewPager组件
第二步 为每个页面建立布局文件,把界面写好
第三步 为每个页面新建Fragment类,并加载布局文件中的界面
第四部 为ViewPager设定Adapter,只不过这里的Adapter不是PagerAdapter,而是换成
FragmentPagerAdapter,实现两个方法:
getCount():返回页面数目
getItem(position):返回position位置的Fragment。
下面来看一个ViewPager与Fragment实现页面滑动效果的例子:
首先继承FragmentActivity,
为ViewPager提供展示所需的Fragment和FragmentPagerAdapter:
Fragment来指定页面的布局以及功能
// fragment private class MyFragment extends Fragment { private String text; private int color; public MyFragment(String text,int color) { this.text = text; this.color = color; } @Override public View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) { TextView tv = new TextView(MainActivity.this); tv.setBackgroundColor(color); tv.setText(text); return tv; } }
adapter指定该Viewpager有多少页面以及那个位置需要显示哪个页面:
// adapter private class MyAdapter extends FragmentPagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return pages.size(); } @Override public Fragment getItem(int arg0) { return pages.get(arg0); } }
设置OnPagechangelistener,指定页面改变时需要做什么其他操作:
@Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0,float arg1,int arg2) { LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) tabline.getLayoutParams(); lp.leftMargin = (int) ((arg0 + arg1) * mTablinewidth); tabline.setLayoutParams(lp); } @Override public void onPageSelected(int arg0) { // set titles for (int i = 0; i < titles.size(); i++) { if (arg0 == i) { titles.get(i).setSelected(true); } else { titles.get(i).setSelected(false); } } }
完整的代码:
package com.hzy.myviewpager; import java.util.ArrayList; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPagechangelistener; import android.util.displayMetrics; import android.view.display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.TextView; import com.hzy.myviewpager.R.id; public class MainActivity extends FragmentActivity implements OnPagechangelistener,OnClickListener { ViewPager pager = null; View tabline = null; private int mTablinewidth; // titles TextView title1 = null; TextView title2 = null; TextView title3 = null; ArrayList<TextView> titles = null; ArrayList<Fragment> pages = null; @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); initView(); initTabline(); } private void initView() { setContentView(R.layout.activity_main); pages = new ArrayList<Fragment>(); titles = new ArrayList<TextView>(); pager = (ViewPager) findViewById(id.main_viewpager); title1 = (TextView) findViewById(id.main_tab1); title2 = (TextView) findViewById(id.main_tab2); title3 = (TextView) findViewById(id.main_tab3); title1.setonClickListener(this); title2.setonClickListener(this); title3.setonClickListener(this); titles.add(title1); titles.add(title2); titles.add(title3); // create new fragments pages.add(new MyFragment("tab1",Color.BLUE)); pages.add(new MyFragment("tab2",Color.RED)); pages.add(new MyFragment("tab3",Color.CYAN)); // set adapter pager.setAdapter(new MyAdapter(getSupportFragmentManager())); pager.setonPagechangelistener(this); pager.setCurrentItem(0); titles.get(0).setSelected(true); } // tablines private void initTabline() { tabline = findViewById(id.main_tab_line); display display = getwindow().getwindowManager().getDefaultdisplay(); displayMetrics outMetrics = new displayMetrics(); display.getMetrics(outMetrics); mTablinewidth = outMetrics.widthPixels / 3; LayoutParams lp = tabline.getLayoutParams(); lp.width = mTablinewidth; tabline.setLayoutParams(lp); } @Override public void onClick(View v) { switch (v.getId()) { case id.main_tab1: pager.setCurrentItem(0,true); break; case id.main_tab2: pager.setCurrentItem(1,true); break; case id.main_tab3: pager.setCurrentItem(2,true); break; default: break; } } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0,int arg2) { LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) tabline.getLayoutParams(); lp.leftMargin = (int) ((arg0 + arg1) * mTablinewidth); tabline.setLayoutParams(lp); } @Override public void onPageSelected(int arg0) { // set titles for (int i = 0; i < titles.size(); i++) { if (arg0 == i) { titles.get(i).setSelected(true); } else { titles.get(i).setSelected(false); } } } // fragment private class MyFragment extends Fragment { private String text; private int color; public MyFragment(String text,int color) { this.text = text; this.color = color; } @Override public View onCreateView(LayoutInflater inflater,@Nullable Bundle savedInstanceState) { TextView tv = new TextView(MainActivity.this); tv.setBackgroundColor(color); tv.setText(text); return tv; } } // adapter private class MyAdapter extends FragmentPagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return pages.size(); } @Override public Fragment getItem(int arg0) { return pages.get(arg0); } } }
代码中通过实现OnPagechangelistener接口手动设置了页面指示条的位置。
Android NestedScrollView 嵌套 ViewPager 以及 ViewPager 内嵌套 recyclerView 的问题
NestedScrollView 嵌套 viewpager 会出现两个问题
1.viewpager 无法显示,高度为 0
2. 嵌套后 NestedScrollView 无法滑动
先说第一个问题:
viewpager 无法正常显示,只需要在 NestedScrollView 内加入
android:fillViewport="true"
就可以了
<android.support.v4.widget.NestedScrollView
android:id="@+id/novice_live_scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:fillViewport="true"
>
第二个问题,嵌套后 NestedScrollView 无法滑动,这个问题只要我们重写一个 viewpager,然后在 xml 里用我们的 viewpager 就可以了
public class WrapContentHeightViewPager extends ViewPager {
public WrapContentHeightViewPager(Context context) {
super(context);
}
public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int height = 0;
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
if (h > height) height = h;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
如果 viewpager 内还嵌套了 recycleview,只想让 nestedScrollView 滑动,recyclerView 只用来展示,那么还需要对 recyclerview 进行处理,如下:
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false) {
@Override
public boolean canScrollVertically() {
return false;
}
};
recycler.setLayoutManager(linearLayoutManager);
记录一个发现的小坑,有遇到这些问题的朋友,希望这个帖子可以帮到大家。
Android ViewPager嵌套ViewPager布局
一、事件分发与拦截问题
dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,
然后决定是自身消费当前事件还是继续往下分发给子控件处理。返回true表示不继续分发,事件没有被消费。
返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。
onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。
onInterceptTouchEvent是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,
不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,
因为ViewGroup中可能还有子View,而在Android中View中是不能再包含子View的(iOS可以)。
二、viewPager嵌套问题的处理
package com.lwj.app.customview;
import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
public class ChildViewPager extends ViewPager{
/** 触摸时按下的点 **/
PointF downP = new PointF();
/** 触摸时当前的点 **/
PointF curP = new PointF();
OnSingleTouchListener onSingleTouchListener;
public ChildViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public ChildViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
//每次进行onTouch事件都记录当前的按下的坐标
if(getChildCount()<=1)
{
return super.onTouchEvent(arg0);
}
curP.x = arg0.getX();
curP.y = arg0.getY();
if(arg0.getAction() == MotionEvent.ACTION_DOWN)
{
//记录按下时候的坐标
//切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变
downP.x = arg0.getX();
downP.y = arg0.getY();
//此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
getParent().requestDisallowInterceptTouchEvent(true);
}
if(arg0.getAction() == MotionEvent.ACTION_MOVE){
//此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
getParent().requestDisallowInterceptTouchEvent(true);
}
if(arg0.getAction() == MotionEvent.ACTION_UP || arg0.getAction() == MotionEvent.ACTION_CANCEL){
//在up时判断是否按下和松手的坐标为一个点
//如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick
getParent().requestDisallowInterceptTouchEvent(false);
if(downP.x==curP.x && downP.y==curP.y){
return true;
}
}
super.onTouchEvent(arg0); //注意这句不能 return super.onTouchEvent(arg0); 否则触发parent滑动
return true;
}
}
Android ViewPager:更新ViewPager中的屏幕外缓存片段
另外,我有增加/减少字体大小的按钮,通过添加其默认大小加上一个值(由inc / dec字体大小按钮更改),计算每个textView的字体大小.
我的问题是如果在应用大小更改后第一次显示视图,它将在onCreateView()中创建所需大小的textView,但是如果片段已被缓存并且onCreateView不再被调用,则不知道如何更新其textViews考虑到只有一个缓存的片段正在屏幕上显示(我可以更新它没有任何问题),但其他的没有显示(在这种情况下,我不知道他们是否附加到活动).
换句话说,如何检测哪些片段由ViewPager及其onCreateView已被调用(这些片段更新到其视图必须被应用).我在下面的照片中用浅绿色标记了问号:
解决方法
mViewPager.setoffscreenPageLimit(int);
例如,有许多具有图像和动画的项目.如果您缓存所有这些,这可能会导致OutOfMemoryError.要防止,您可以定义要限制的页面限制.
编辑:而不是HashMap< Integer,Object>,最好使用SparseArray<Object>
.
关于android – 在ViewPager中禁用动画和viewpager取消动画的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android App在ViewPager中使用Fragment的实例讲解、Android NestedScrollView 嵌套 ViewPager 以及 ViewPager 内嵌套 recyclerView 的问题、Android ViewPager嵌套ViewPager布局、Android ViewPager:更新ViewPager中的屏幕外缓存片段的相关知识,请在本站寻找。
本文标签: