-----------------------下面这个效果只是整个效果的第三步-(目前左右拖动图片+回弹效果+RadioGroup切换效果)---一会继续更新博客-------------------------
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <RadioGroup android:id="@+id/rg_group" android:gravity="center_horizontal" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > </RadioGroup> <com.example.mscrollview.mScrollView android:layout_below="@id/rg_group" android:id="@+id/msv" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
package com.example.mscrollview; import com.example.mscrollview.mScrollView.OnPageChange; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; public class MainActivity extends Activity { // 1、图片资源 private int[] ids = { R.drawable.a1, R.drawable.a2, R.drawable.a3, R.drawable.a3, R.drawable.a5, R.drawable.a6 }; // 2、定义自定义控件 private mScrollView msv; //radioGroup private RadioGroup radioGroup; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建自定义控件对象 msv = (mScrollView) findViewById(R.id.msv); //获取radioGroup radioGroup = (RadioGroup) findViewById(R.id.rg_group); // 循环遍历6张图片,依次为图片对象添加背景图片,然后加入到msv自定义控件中 for (int i = 0; i < ids.length; i++) { ImageView iv = new ImageView(this); iv.setBackgroundResource(ids[i]); //3、 添加子页面 msv.addView(iv); } //添加radio for (int i = 0; i < msv.getChildCount(); i++) { RadioButton radioButton = new RadioButton(this); //将图片设置一个id?????? radioButton.setId(i); //默认第一个高亮显示 if (i==0) { radioButton.setChecked(true); } //添加 radioGroup.addView(radioButton); } /* * 设置监听-滑动页面 */ msv.setOnPageChangeListener(new OnPageChange() { //获取那个图片设置的id,我这里之前也是报错的,后来测试了下,图片id总比radiobutton大一, //就直接将其加1了,这里好晕,感觉如果之前图片id设置的是1,这里需要+1,才可以跟图片id匹配 @Override public void moveTo(int ScrolledIndex) { radioGroup.check(ScrolledIndex); } }); /* * 设置radioGroup的监听事件--点击radioButton */ radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { msv.moveTo(checkedId); } }); } }
mScrollView.java
package com.example.mscrollview; import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; public class mScrollView extends ViewGroup { //接口利用时候,定义成员变量 private OnPageChange pageChange; /** * 设置监听页面改变 */ public void setOnPageChangeListener(OnPageChange pageChange) { this.pageChange = pageChange; } /** * 监听页面的改变 */ public interface OnPageChange { // 当页面改变的时候回调 public void moveTo(int ScrolledIndex); } //定义手势识别器 private GestureDetector gestureDetector; //1、构造器 public mScrollView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } /* * 2、得到孩子页面的位置和大小 */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { for (int i = 0; i < getChildCount(); i++) { //根据id得到孩子 View childView = getChildAt(i); //布局每个页面的位置 childView.layout(i*getWidth(), 0, getWidth()+getWidth()*i, getHeight()); } } /* * 初始化view */ private void initView(Context context) { //手势识别实例化 gestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){ //手指拖动调用该方法,e1代表按下,e2代表离开事件 @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { //x轴y轴移动的距离 scrollBy((int) distanceX, 0); //事件处理完毕 return true; //scrollTo(x,y)要移动到的坐标上 } }); } /** * 接收事件onScroll */ //记录起始坐标 private float startX; //记录目前页面的索引位置 private int currentIndex; @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event);//执行父类方法,事件不会被拦截 //接受事件 gestureDetector.onTouchEvent(event); switch (event.getAction()) { //这个案例事件涉及到三种,按下、移动、离开 case MotionEvent.ACTION_DOWN: //只要一按下就记录起始坐标 startX = event.getX(); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: //手指离开,记录新坐标 float endX = event.getX(); //计算偏移量 if (endX-startX>getWidth()/2) { //上一个页面 currentIndex --; }else if(startX - endX >getWidth()/2){ //显示下一个页面 currentIndex ++; } moveTo(currentIndex); break; default: break; } return true; } /* * 根据当前页面索引,移动到对应的位置 */ public void moveTo(int ScrolledIndex) { //屏蔽非法值如果移动到的页面缩影小于0就直接定位到第一张 if (ScrolledIndex<0) { ScrolledIndex = 0; } //如果移动到的页码大于最后一张页面的索引,就定位到最后一张 if (ScrolledIndex > getChildCount()-1) { ScrolledIndex = getChildCount()-1; } //将新的页面索引赋值给目前的页面索引值 currentIndex = ScrolledIndex; //???????????????? if (pageChange!=null) { pageChange.moveTo(ScrolledIndex); } //getScrollX() 就是当前view的左上角相对于母视图的左上角的X轴偏移量。得到移动的距离 int distanceX = currentIndex*getWidth() - getScrollX(); //定位到某个坐标 scrollTo(currentIndex*getWidth(), 0); } }