zoukankan      html  css  js  c++  java
  • android控件跟随手势滑动改变位置

    要求:
    1.通过手指移动来拖动图片  
    2.控制图片不能超出屏幕显示区域

    技术点:
    1.MotionEvent处理
    2.对View进行动态定位(layout)

    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" >
    
        <ImageView
            android:id="@+id/iv_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/test"/>
    
    </RelativeLayout>
    

    MainActivity:

    public class MainActivity extends Activity implements OnTouchListener {
    
    	private ImageView iv_main;
    	private RelativeLayout parentView;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		iv_main = (ImageView) findViewById(R.id.iv_main);
    		parentView = (RelativeLayout) iv_main.getParent();
    		/*
    		int right = parentView.getRight(); //0
    		int bottom = parentView.getBottom();   //0
    		Toast.makeText(this, right+"---"+bottom, 1).show();
    		*/
    		//设置touch监听 
    		iv_main.setOnTouchListener(this);
    	}
    	
    	private int lastX;
    	private int lastY;
    	private int maxRight;
    	private int maxBottom;
    	
    	@Override
    	public boolean onTouch(View v, MotionEvent event) {
    		//得到事件的坐标
    		int eventX = (int) event.getRawX();
    		int eventY = (int) event.getRawY();
    		switch (event.getAction()) {
    		case MotionEvent.ACTION_DOWN:
    			
    			//得到父视图的right/bottom
    			if(maxRight==0) {//保证只赋一次值
    				maxRight = parentView.getRight();
    				maxBottom = parentView.getBottom();
    			}
    			
    			
    			//第一次记录lastX/lastY
    			lastX =eventX;
    			lastY = eventY;
    			break;
    		case MotionEvent.ACTION_MOVE:
    			//计算事件的偏移
    			int dx = eventX-lastX;
    			int dy = eventY-lastY;
    			//根据事件的偏移来移动imageView
    			int left = iv_main.getLeft()+dx;
    			int top = iv_main.getTop()+dy;
    			int right = iv_main.getRight()+dx;
    			int bottom = iv_main.getBottom()+dy;
    			
    			//限制left  >=0
    			if(left<0) {
    				right += -left;
    				left = 0;
    			}
    			//限制top
    			if(top<0) {
    				bottom += -top;
    				top = 0;
    			}
    			//限制right <=maxRight
    			if(right>maxRight) {
    				left -= right-maxRight;
    				right = maxRight;
    			}
    			//限制bottom <=maxBottom
    			if(bottom>maxBottom) {
    				top -= bottom-maxBottom;
    				bottom = maxBottom;
    			}
    			
    			iv_main.layout(left, top, right, bottom);
    			//再次记录lastX/lastY
    			lastX = eventX;
    			lastY = eventY;
    			break;
    
    		default:
    			break;
    		}
    		return true;//所有的motionEvent都交给imageView处理
    	}
    }
    

      

      

  • 相关阅读:
    从多渠道打包与友盟统计有这一篇就够了
    多渠道打包
    studio构建错误Element uses-permission#android.permission.ACCESS_NETWORK_STATE at AndroidManifest.xml:38:5-79 dupli
    ADB命令与monkey
    正则表达式和文本挖掘(Text Mining)
    一步一步教你使用Git
    Android常见开源解决方案
    Android Intent到底能做些什么
    支付宝集成
    Theano 学习三 conv2d
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/6512195.html
Copyright © 2011-2022 走看看