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

      

      

  • 相关阅读:
    软件开发和机械制造的核心差别
    不做纯技术导向的程序员与中国特色的社会主义
    从代码里你可以看到什么?
    多少钱才可让人重拾理想
    项目经理一定比码农好么?
    技术还是管理?
    评李彦宏先生的内部邮件
    组织行为学对项目管理的意义(1)
    组织行为学对项目管理的意义:动机理论
    Silverlight与ashx通讯序列化DateTime时需注意的细节
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/6512195.html
Copyright © 2020-2023  润新知