继承ViewGroup类方式(循序渐进之第3步效果

———————–下面这个效果只是整个效果的第三步-(目前左右拖动图片+回弹效果+RadioGroup切换效果)—一会继续更新博客————————-

activity_main.xml

<RelativeLayout xmlns:android=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent" ><RadioGroupandroid: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.mScrollViewandroid: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;//radioGroupprivate RadioGroup radioGroup;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//创建自定义控件对象msv = (mScrollView) findViewById(R.id.msv);//获取radioGroupradioGroup = (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);}//添加radiofor (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匹配@Overridepublic void moveTo(int ScrolledIndex) {radioGroup.check(ScrolledIndex);}});/* * 设置radioGroup的监听事件–点击radioButton */radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic 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、得到孩子页面的位置和大小 */@Overrideprotected 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代表离开事件@Overridepublic 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;@Overridepublic 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);}}

因为有梦,所以勇敢出发,选择出发,便只顾风雨兼程。

继承ViewGroup类方式(循序渐进之第3步效果

相关文章:

你感兴趣的文章:

标签云: