自定义控件---继承ViewGroup类方式(循序渐进之第3步效果----图片左右拖动+RadioGroup切换效果)

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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值