GVKun编程网logo

android – 在ViewPager中禁用动画(viewpager取消动画)

7

如果您对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 – 在ViewPager中禁用动画(viewpager取消动画)

我想在自定义viewPager中禁用转换的所有动画.
此视图分页器包含四个选项卡 – 每个选项卡加载一个片段 – 以及视图分页器所做的是切换选项卡:例如,第一个选项卡是索引,第二个选项卡是地图等.

问题是,如果,作为第一个选项卡,我点击第四个选项卡,我可以看到ViewPager如何通过第二个和第三个选项卡,并在第四个选项卡上停止,我不希望这发生.

我尝试禁用此ViewPager的所有动画,尝试在每次用户选择要显示的新选项卡时使用setAnimation为null,但它仍然无效.

有什么想法实现这个,拜托?
非常感谢提前!

编辑:我也尝试覆盖每个片段的onCreateAnimation但仍然无法正常工作

解决方法:

我终于发现:只需调用带有额外参数的mViewPager.setCurrentItem(position)就可以解决问题,这是ViewPager的平滑滚动.
在此之后,滚动将在没有任何平滑的情况下完成,因此将不会看到动画.

Android App在ViewPager中使用Fragment的实例讲解

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 的问题

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布局

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中的屏幕外缓存片段

Android ViewPager:更新ViewPager中的屏幕外缓存片段

我有一个ViewPager,它包含它的片段中的几个TextViews,它们具有不同的字体大小.
另外,我有增加/减少字体大小的按钮,通过添加其默认大小加上一个值(由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中的屏幕外缓存片段的相关知识,请在本站寻找。

本文标签: