仿viewPager-实现滑动翻页
- 实现布局(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与视图滚动的问题,仅仅是代码。