android viewpage解决嵌套

子viewpage 自定义

写法一:

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 onInterceptTouchEvent(MotionEvent arg0) {
       // TODO Auto-generated method stub
       //当拦截触摸事件到达此位置的时候,返回true,
       //说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent
       return true;
   }
  
   @Override
   public boolean onTouchEvent(MotionEvent arg0) {
       // TODO Auto-generated method stub
       //每次进行onTouch事件都记录当前的按下的坐标
       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){
           //在up时判断是否按下和松手的坐标为一个点
           //如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick
           if(downP.x==curP.x && downP.y==curP.y){    // 当前的点和现在的点相等
               onSingleTouch(); //点击事件回调
               return true;
           }
       }
      
       return super.onTouchEvent(arg0);
   }
  
   /**
   * 单击
   */
   public void onSingleTouch() {
   if (onSingleTouchListener!= null) {
  
     onSingleTouchListener.onSingleTouch();
   }
   }
  
   /**
   * 创建点击事件接口
   * @author wanpg
   *
   */
   public interface OnSingleTouchListener {
       public void onSingleTouch();
   }
  
   public void setOnSingleTouchListener(OnSingleTouchListener
           onSingleTouchListener) {
        this.onSingleTouchListener = onSingleTouchListener;
   }
  
}

写法二 :

public class MyViewPager extends ViewPager {

    public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    PointF downPoint = new PointF();
    OnSingleTouchListener onSingleTouchListener;

    @Override
    public boolean onTouchEvent(MotionEvent evt) {
        switch (evt.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // 记录按下时候的坐标
            downPoint.x = evt.getX();
            downPoint.y = evt.getY();
            if (this.getChildCount() > 1) { //有内容,多于1个时
                // 通知其父控件,现在进行的是本控件的操作,不允许拦截
                getParent().requestDisallowInterceptTouchEvent(true);
            }
            break;
        case MotionEvent.ACTION_MOVE:
            if (this.getChildCount() > 1) { //有内容,多于1个时
                // 通知其父控件,现在进行的是本控件的操作,不允许拦截
                getParent().requestDisallowInterceptTouchEvent(true);
            }
            break;
        case MotionEvent.ACTION_UP:
            // 在up时判断是否按下和松手的坐标为一个点
            if (PointF.length(evt.getX() - downPoint.x, evt.getY()
                    - downPoint.y) < (float) 5.0) {
                onSingleTouch(this);
                return true;
            }
            break;
        }
        return super.onTouchEvent(evt);
    }

    public void onSingleTouch(View v) {
        if (onSingleTouchListener != null) {
            onSingleTouchListener.onSingleTouch(v);
        }
    }

    public interface OnSingleTouchListener {
        public void onSingleTouch(View v);
    }

    public void setOnSingleTouchListener(
            OnSingleTouchListener onSingleTouchListener) {
        this.onSingleTouchListener = onSingleTouchListener;
    }
}
时间: 2024-11-01 14:40:11

android viewpage解决嵌套的相关文章

解决ViewPage中嵌套有ListView或者滑动手势等造成滑动的冲突

public class ViewPagerCompat extends ViewPager { //mViewTouchMode表示ViewPager是否全权控制滑动事件,默认为false,即不控制 private boolean mViewTouchMode = false; public ViewPagerCompat(Context context, AttributeSet attrs) { super(context, attrs); } public void setViewTou

Android中ScrollView嵌套ListView只显示一行的解决方案

Android中ScrollView嵌套ListView只显示一行的解决方案 解决方案1: 直接把包含ListView控件的ScrollView控件从布局文件中去除,留下ListView控件,这是最简单快捷的解决办法. 如果一定要在ScrollView中包含ListView,则参考 解决方案2: public void showlist() { List<HashMap<String, String>> dataHashMaps = new ArrayList<HashMap

解决嵌套GridView显示不全的问题

package com.adan.selectcitydome.view; import android.content.Context; import android.util.AttributeSet; import android.widget.GridView; /** * 自定义GridView,解决嵌套Grideview的显示不完全的问题 */ public class MyGridView extends GridView { public MyGridView(Context c

Android慎用layout嵌套, 尽量控制在5层下面java.lang.StackOverflowError

一.探寻原因 在一个复杂的layout嵌套较多layout的android界面.在Android 2.3.内存较低 的机型上,出现 java.lang.StackOverflowError 这个Exception,appcrash退出. 这个错误出现的比較奇怪,在我做技术调研的时候,这个界面是放在4.0的系统中測试,工作非常正常,没有出现这个严重错误. android SDK中对该错误的出现的场景描写叙述为:因为栈调用的层次太多.超过了虚拟器dalvik的最大限制(作为一个虚拟器參数,可定制)导

Android 中解决输入法挡住输入框的问题

android 中解决输入法挡住输入框的问题 大家在布局时候,有时候会发现输入框被挡住一部分,能完全显示出来,但是系统自带短信界面可以完全漂浮在软键盘之上,看了一下短信源码,修改一下输入模式就可以了,源码如下代码方式: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 也可以简

android滑动组件嵌套一般思路,多任务手势思路,触摸传递思路,【例】listview嵌套viewpager

在android UI开发中,我们经常会遇到这种需求: 两个支持滑动的组件,比如listview嵌套多个listview,listview的item是一个viewpager或gallary?亦或是scrollview嵌套scrollview等等. 一般情况下,你还可能需要支持如下几种功能: ¤ 两层组件都可以滑动 ¤ 不让两个组件同时滑动,或者让两个组件同时滑动并可以自己调节 ¤ 不影响底层view的子view和嵌套view的子view的点击事件 实现上述功能时,我们也经常遇到一些问题: ¤ 点

sdk manager 创建的虚拟机启动的时候总是在Android字样解决

一直显示Android字样,只需要删除目录下的snapshots.img 找到sdk的目录下的\tools\lib\emulator,然后删除上面的文件snapshots.img即可,我的sdk路径是下面的,所以进入这里杀出它就好了 D:\adt-bundle-windows-x86-20140321\adt-bundle-windows-x86-20140321\sdk\tools\lib\emulatorsdk manager 创建的虚拟机启动的时候总是在Android字样解决,布布扣,bu

图片--Android有效解决加载大图片时内存溢出的问题

Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView

android开发 Fragment嵌套调用常见错误

在activity中有时需要嵌套调用fragment,但嵌套调用往往带来视图的显示与预期的不一样或是fragment的切换有问题.在使用时要注意几点: 1.fragment中嵌套fragment,子fragment视图无法显示: 如下: 父fragment的.xml文件: <pre name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.co