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处理
    	}
    }
    

      

      

  • 相关阅读:
    idea spring boot启动项目上面有红色叉
    hibernate Criteria中多个or和and的用法 and ( or or)
    CAS Server 4.2.7(自定义密码验证) 部署
    Web应用系统集成CAS-rest指南
    用DBMS_REDEFINITION将普通表转换为分区表
    windows编译libevent时报告“缺少print_winsock_errors.obj”的解决
    Oracle表增删分区的脚本
    libcassandra开发示例
    关于MongoDB API的两个小经验
    C/C++开发Cassandra的一些经验
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/6512195.html
Copyright © 2011-2022 走看看