自定义控件-继承ViewGroup类形式(循序渐进之第1步效果-图片左右拖动)

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

-----------------------下面这个效果只是整个效果的刚开始-(目前只可以左右拖动图片)---一会继续更新博客-------------------------

自定义控件-继承ViewGroup类形式(循序渐进之第1步效果-图片左右拖动)

配置文件

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" >


    <com.example.mscrollview.mScrollView
        android:id="@+id/msv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

MainActivity.java(步骤都在注释里,简单明了,就是得到图片资源,得到自定义控件,将图片放到自定义控件里,因为自定义控件是继承Viewgroup,是一个组合,需要添加东西,ok? ok!)

package com.example.mscrollview;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;

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;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//创建自定义控件对象
		msv = (mScrollView) findViewById(R.id.msv);
		// 循环遍历6张图片,依次为图片对象添加背景图片,然后加入到msv自定义控件中
		for (int i = 0; i < ids.length; i++) {
			ImageView iv = new ImageView(this);
			iv.setBackgroundResource(ids[i]);
			//3、 添加子页面
			msv.addView(iv);
		}
	}
}
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 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
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		super.onTouchEvent(event);//执行父类方法,事件不会被拦截
		//接受事件
		gestureDetector.onTouchEvent(event);
		return true;
	}

}