HardBirch

Android控件拖动的实现

时间:12-03-31 栏目:安卓源码解析与小应用 作者:张飞不张,文采横飞 评论:1 点击: 1,907 次

              这个也是从网上得到的代码,例子比较简单,但是如果有需要此功能的,这个例子可以提供很多提示,首先,给个截图


这个是拖动以后的效果,一个imageview和一个button控件,提供两份代码下载吧,一份是只有一个Button的,另一份就是像上图,就是多了一个imagview!先看下代码吧,比较简单:

public class DraftTest extends Activity implements OnTouchListener{
	/** Called when the activity is first created. */
	int screenWidth;
	int screenHeight;
	int lastX;
	int lastY;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		DisplayMetrics dm = getResources().getDisplayMetrics();
		screenWidth = dm.widthPixels;
		screenHeight = dm.heightPixels - 50;
		Button button=(Button)findViewById(R.id.btn);
		ImageView imageView=(ImageView)findViewById(R.id.btn2);
		imageView.setOnTouchListener(this);
		button.setOnTouchListener(this);
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		int action=event.getAction();
		Log.i("@@@@@@", "Touch:"+action);
		//Toast.makeText(DraftTest.this, "λ�ã�"+x+","+y, Toast.LENGTH_SHORT).show();
		switch(action){
		case MotionEvent.ACTION_DOWN:
			lastX = (int) event.getRawX();
			lastY = (int) event.getRawY();
			break;
			/**
			 * layout(l,t,r,b)
			 * l  Left position, relative to parent
            t  Top position, relative to parent
            r  Right position, relative to parent
            b  Bottom position, relative to parent
			 * */
		case MotionEvent.ACTION_MOVE:
			int dx =(int)event.getRawX() - lastX;
			int dy =(int)event.getRawY() - lastY;

			int left = v.getLeft() + dx;
			int top = v.getTop() + dy;
			int right = v.getRight() + dx;
			int bottom = v.getBottom() + dy;
			if(left < 0){
				left = 0;
				right = left + v.getWidth();
			}
			if(right > screenWidth){
				right = screenWidth;
				left = right - v.getWidth();
			}
			if(top < 0){
				top = 0;
				bottom = top + v.getHeight();
			}
			if(bottom > screenHeight){
				bottom = screenHeight;
				top = bottom - v.getHeight();
			}
			v.layout(left, top, right, bottom);
			Log.i("@@@@@@", "position��" + left +", " + top + ", " + right + ", " + bottom);
			lastX = (int) event.getRawX();
			lastY = (int) event.getRawY();
			break;
		case MotionEvent.ACTION_UP:
			break;
		}
		return false;
	}
}



高度减去50是减去状态栏和标题栏的高度。

case MotionEvent.ACTION_DOWN:
			lastX = (int) event.getRawX();
			lastY = (int) event.getRawY();
			break;

然后获取控件一开始的位置,然后在ACTION_MOVIE中:

int dx =(int)event.getRawX() - lastX;
			int dy =(int)event.getRawY() - lastY;

			int left = v.getLeft() + dx;
			int top = v.getTop() + dy;
			int right = v.getRight() + dx;
			int bottom = v.getBottom() + dy;
			if(left < 0){
				left = 0;
				right = left + v.getWidth();
			}
			if(right > screenWidth){
				right = screenWidth;
				left = right - v.getWidth();
			}
			if(top < 0){
				top = 0;
				bottom = top + v.getHeight();
			}
			if(bottom > screenHeight){
				bottom = screenHeight;
				top = bottom - v.getHeight();
			}
			v.layout(left, top, right, bottom);
			Log.i("@@@@@@", "position��" + left +", " + top + ", " + right + ", " + bottom);
			lastX = (int) event.getRawX();
			lastY = (int) event.getRawY();	

getLeft()方法得到的是控件坐标距离父控件原点(左上角,坐标(0,0))的x轴距离,getReght()是控件右边距离父控件原点的x轴距离,同理,getTop和getButtom是距离的y轴距离。

if(left < 0){
				left = 0;
				right = left + v.getWidth();
			}
			if(right > screenWidth){
				right = screenWidth;
				left = right - v.getWidth();
			}
			if(top < 0){
				top = 0;
				bottom = top + v.getHeight();
			}
			if(bottom > screenHeight){
				bottom = screenHeight;
				top = bottom - v.getHeight();
			}	

这里的判断是为了是控件不超出屏幕以外,即:到达边界以后,不能再移动。

v.layout(left, top, right, bottom);

设置View的位置。

有一点忘记说了,就是像ImageView和TextView这些控件,要想实现拖动,要在xml文件中设置它的clickable为true。

android:clickable="true"

就这样,这些就是这个demo的全部内容。

最后,是代码的下载地址:


http://download.csdn.net/detail/aomandeshangxiao/4187376

http://download.csdn.net/detail/aomandeshangxiao/4189910


声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: Android控件拖动的实现

Android控件拖动的实现:目前有1 条留言

  1. 沙发
    siyueyiri2012:

    学习中,顶先

    2012-10-11 18:16 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐