-----------------------下面这个效果只是整个效果的第三步-(目前左右拖动图片+回弹效果+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>
MainActivity.java
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);
}
}