【例子】随意拖动Button

一个可以随意拖动Button的例子,难点在于实时更新坐标

package org.test;

import android.app.Activity;
import android.content.Context;
import android.inputmethodservice.KeyboardView.OnKeyboardActionListener;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;

public class TestActivity extends Activity
{
    private static final String tag="My Tag";
    private Context context;
    private View container;
    private Button btn;
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.main);
	    Log.v(tag, "onCreate");
	    context=this;
	    container=findViewById(R.id.container);
	    
	    btn=(Button)findViewById(R.id.btn);
	    btn.setOnTouchListener(touchLisener);
	    btn.setOnClickListener(new View.OnClickListener()
	    {
            @Override
            public void onClick(View v)
            {
                Log.i(tag,"btn clicked");
            }
        });
	}
	
	

    @Override
	protected void onStart()
	{
    	Log.v(tag, "onStart");
		super.onStart();
	}

	@Override
	protected void onResume()
	{
		Log.v(tag, "onResume");
		super.onResume();
	}

	OnTouchListener touchLisener=new OnTouchListener()
    {
        int lastX, lastY;
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            // TODO Auto-generated method stub
            switch (event.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                    lastX = (int) event.getRawX();
                    lastY = (int) event.getRawY();
                    Log.v("My Tag", "v.getLeft()=" + String.valueOf(v.getLeft()) + "\n" + 
                    				"v.getTop()=" + String.valueOf(v.getTop())+"\n" + 
                    				"v.getRight()=" + String.valueOf(v.getRight())+"\n" + 
                    				"v.getBottom()" + String.valueOf(v.getBottom())+"\n" + 
                    				"v.getWidth()=" + String.valueOf(v.getWidth())+"\n" + 
                    				"v.getHeight()=" + String.valueOf(v.getHeight())+"\n" +
                    				"lastX:" + String.valueOf(lastX) + " " + 
                    				"lastY:" + String.valueOf(lastY));
                    break;
                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 > container.getMeasuredWidth())
		            {  
		                right = container.getMeasuredWidth();  
		                left = right - v.getWidth();  
		            }  
		
		            if (top < 0) 
		            {  
		                top = 0;  
		                bottom = top + v.getHeight();  
		            }  
		
		            if (bottom > container.getMeasuredHeight())
		            {  
		                bottom = container.getMeasuredHeight();  
		                top = bottom - v.getHeight();  
		            }
		//            v.measure(right - left, bottom - top);
		            v.layout(left, top, right, bottom);  
		
		            lastX = (int) event.getRawX();
		            lastY = (int) event.getRawY();
		            v.postInvalidate();
                        break;
                case MotionEvent.ACTION_UP:
                    break;
                default:
                    break;
            }
            return false;
        }
    };
}

源代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值