Android 自定义控件----自定义ViewPager--学习笔记

1.自定义ViewPager

xml文件

    <com.example.viewpager2.MyViewPager
        android:layout_width="match_parent"
        android:layout_height="450dp"
        android:id="@+id/MyViewPager"

/>

实例化 

public class MainActivity extends Activity {
    private MyViewPager MyViewPager;
    int ids[]={R.drawable.a1,R.drawable.a2,R.drawable.a3,R.drawable.a4,R.drawable.a5,R.drawable.a6};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyViewPager = (MyViewPager) findViewById(R.id.MyViewPager);

        //添加页面
        for (int i = 0; i < ids.length; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setBackgroundResource(ids[i]);

            //添加到MyViewPager这个View中
            MyViewPager.addView(imageView);
        }
}

}

指定到对应的图片上

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        //遍历孩子,给每个孩子指定在屏幕上的坐标位置
        for (int i = 0; i < getChildCount(); i++) {
            View childView = getChildAt(i);
            childView.layout(i * getWidth(), 0, (i + 1) * getWidth(), getHeight());

        }

    }

 

2.手势识别器

* 1.定义出来

private GestureDetector detector;

* 2.实例化-把想要的方法重新

    private void initView(final Context context) {
        detector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public void onLongPress(MotionEvent e) {
                Toast.makeText(context, "长按", Toast.LENGTH_SHORT).show();
                super.onLongPress(e);
            }

            /**
             *
             * @param e1
             * @param e2
             * @param distanceX 在X轴上滑动的距离
             * @param distanceY 在轴上滑动的距离
             * @return
             */
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                Toast.makeText(context, "滚动", Toast.LENGTH_SHORT).show();
                /**
                 * X:要在X轴移动的距离
                 * Y:要在Y轴移动的距离
                 * */
                scrollBy((int) distanceX, 0);
                return true;
            }

            @Override
            public boolean onDoubleTap(MotionEvent e) {
                Toast.makeText(context, "双击", Toast.LENGTH_SHORT).show();
                return super.onDoubleTap(e);
            }
        });
    }

* 3.在OnTouchEvent()把事件传递给手势识别器

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        //3.把事件传递给手势识别器
        detector.onTouchEvent(event);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        return true;

    }

 

3.scrollBy  正值:左移

                  负值:右移

   scrollTo  :起始值+要移动的距离 = 要移动到那里去 ,根据坐标移动

 

4.回弹 上下页面

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        //3.把事件传递给手势识别器
        detector.onTouchEvent(event);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.w("www","onTouchEvent == ACTION_DOWN");
                //1.记录坐标
                startX = event.getX();
                break;
            case MotionEvent.ACTION_MOVE:
                Log.w("www","onTouchEvent == ACTION_MOVE");

                break;
            case MotionEvent.ACTION_UP:
                Log.w("www","onTouchEvent == ACTION_UP");
                //2.来到新的坐标
                enddX = event.getX();
                //下标位置
                int tempIndex = currentIndex;
                if ((startX - enddX) > getWidth() / 2) {
                    //显示下一个页面
                    tempIndex++;
                } else if ((enddX - startX) > getWidth() / 2) {
                    //显示上一个页面
                    tempIndex--;
                }
                //根据下标位置移动到指定页面
                scrollToPager(tempIndex);

                break;
        }
        return true;

    }
    /**
     * 屏蔽非法值,根据下标位置移动到指定页面
     *
     * @param tempIndex
     */
    public void scrollToPager(int tempIndex) {
        if (tempIndex < 0) {
            tempIndex = 0;

        } else if (tempIndex > getChildCount() - 1) {
            tempIndex = getChildCount() - 1;
        }
        //当前变量的下标位置
        currentIndex = tempIndex;

        //移动到指定位置
        scrollTo(currentIndex*getWidth(),0);

    }

5.解决回弹生硬

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值