仿viewPager-实现滑动翻页

仿viewPager-实现滑动翻页


  1. 实现布局(radioGroup + 自定义视图)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RadioGroup
        android:id="@+id/rg_main"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </RadioGroup>
    <ms.atguigu.com.l06_myview.MyScrollView
        android:id="@+id/msv_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

2、添加视图(动态),注意对子视图的重新布局

A、Activity中,oncreate()方法下

for(int i = 0;i < ids.length; i++) {
    RadioButton radioButton = new RadioButton(this);
    if(i==0) {
        radioButton.setChecked(true);
    }
    rg_main.addView(radioButton);   //之前有个使用布局参数的

    ImageView imageView = new ImageView(this);
    //imageView.setImageResource();
    imageView.setBackgroundResource(ids[i]);
    msv_main.addView(imageView);
}

B、在自定义视图中,添加如下代码:

//测量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    for(int i = 0;i < getChildCount();i++) {
        View childAt = getChildAt(i);
        childAt.measure(getMeasuredWidth(),getMeasuredHeight());
    }
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    for (int i = 0;i < getChildCount(); i++) {
        View childAt = getChildAt(i);
        //childAt.getWidth?
        childAt.layout(i*getWidth(),0,(i+1)*getWidth(),getHeight());
    }
}

*写到这里,可以运行一下啦,不出意外,木有大问题了,好了,继续:
3、实现触摸事件,也就是咱们要说的活动视图实现界面的滑动(注意这里的自定义视图继承的是ViewGroup)

//添加触摸事件,实现滑动切换
@Override
public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);
    int eventX = (int) event.getRawX();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            lastX = eventX;
            break;
        case MotionEvent.ACTION_MOVE:
            int dx = eventX - lastX;
            int toScrollX = getScrollX() - dx;
            scrollTo(toScrollX, 0);
            lastX = eventX;
            break;
        case MotionEvent.ACTION_UP:

            //!!!!!!!!!!!!!!!!!!!
            int upScrollX = getScrollX() - position * getWidth();
            Log.e("TAG", "position" + position);
            if (upScrollX > getWidth() / 2) {
                switchPage(position + 1);
            } else if (upScrollX < -getWidth() / 2) {
                switchPage(position - 1);
            } else {
                switchPage(position);
            }
            break;
    }

    return true;                   //为什么?
}
//
private void switchPage(int position) {
    if (position < 0) {
        position = 0;
    } else if (position > getChildCount() - 1) {
        position = getChildCount() - 1;
    }
    //更新下标
    if (this.position != position) {
        this.position = position;
    }
    //根据positin计算出toScrollX
    int toScrollX = position * getWidth();
    //平滑滚动
    scroller.startScroll(getScrollX(), 0, toScrollX - getScrollX(), 0);
    invalidate();
}

@Override
public void computeScroll() {
    super.computeScroll();
    if (scroller.computeScrollOffset()) {
        scrollTo(scroller.getCurrX(), 0);
        invalidate();
    }
}

4、_自定义页面改变监听实现单选框同步更新

msv_main.setOnPageChangeListener(new MyScrollView.OnPageChangeListener(){
    @Override
    public void onPageChange(int position) {
        rg_main.check(position);
    }
});

private OnPageChangeListener onPageChangeListener;
public void setOnPageChangeListener(OnPageChangeListener onPageChangeListener) {
    this.onPageChangeListener = onPageChangeListener;
}

public interface OnPageChangeListener {
    void onPageChange(int position);
}

public void switchPage(int position) {
   ****
    //更新下标
    if (this.position != position) {
        this.position = position;

        if(onPageChangeListener != null) {
            onPageChangeListener.onPageChange(position);
        }
    }
}

注意,这里有些问题,没有在代码里说明,关于自定义视图和view与视图滚动的问题,仅仅是代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值