我们来看程序的代码:

要求:

1.通过手指移动来拖动图片

2.控制图片不能超出屏幕显示区域

技术点:

1.MotionEvent处理

2.对View进行动态定位(layout)

package im.weiyuan.com.viewutils;

import android.content.Intent;
import android.os.PersistableBundle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnTouchListener{ private ImageView iv_main;
private RelativeLayout parentView;
private int lastX;
private int lastY;
private int maxRight;
private int maxBottom;
@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); } @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.d("123456","activity dispatchTouchEvent is called" +ev.getAction());
return super.dispatchTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent event) {
Log.d("123456","activity onTouchEvent is called"+event.getAction());
return super.onTouchEvent(event);
} @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处理 }
}
<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="@mipmap/ic_launcher"/>
</RelativeLayout>

最新文章

  1. Boost学习笔记(六) progress_display注意事项
  2. B. Checkout Assistant 01背包变形
  3. SELECTION-SCREEN 文本丢失
  4. 在centOS中加入本地ISO yum源
  5. Building Python 2.7.10 with Visual Studio 2010 or 2015 - Google Chrome
  6. 高性能MySQL--索引学习笔记(原创)
  7. Akka(34): Http:Unmarshalling,from Json
  8. ASP.NET Core部署到Windows IIS
  9. Video clip 视频剪辑:入门级
  10. 设计模式のIOC(控制反转)
  11. Ubuntu Server 16.04修改IP、DNS、hosts
  12. JS 和 Jquery 的一些常用效果
  13. Hadoop生态圈-Hbase的Region详解
  14. logstash定义表达式
  15. MySQL增量备份与恢复实例【转】
  16. (算法)位图BitMap
  17. CSS 文本垂直居中对齐
  18. 报错 Inferred type &#39;S&#39; for type parameter &#39;S&#39; is not within its bound; 解决办法
  19. grid 布局的使用
  20. vuejs angularjs 框架的一些比较(vue项目重构四)

热门文章

  1. Java中的集合(六)继承Collection的Set接口
  2. python调用大漠插件教程01注册大漠
  3. 利用metasploit复现永恒之蓝
  4. RabbitMQ 高级应用
  5. 【译】Welcome to C# 9.0
  6. 使用PRTG和panabit结合定位网络阻塞的来源
  7. jchdl - 初次使用建立项目示例
  8. Chisel3 - bind - Data
  9. Android如何使用OKHttp
  10. java实现机器人行走