博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android动画-拖动
阅读量:6578 次
发布时间:2019-06-24

本文共 3156 字,大约阅读时间需要 10 分钟。

先上图看效果

实质上说是动画有点不妥,确切的说应该是手势的处理,废话不多说看代码

SimpleDragSample.java

public class SimpleDragSample extends Activity {	protected int contentTop;	@Override	protected void onCreate(Bundle savedInstanceState) {		// TODO Auto-generated method stub		super.onCreate(savedInstanceState);		setContentView(R.layout.layout_simpledrag)  ;		DisplayMetrics dm = getResources().getDisplayMetrics()  ;		final int screenWidth = dm.widthPixels  ;		final int screenHeight = dm.heightPixels  ;						Log.e("width,height", screenWidth + "," + screenHeight);				final Button _Button = (Button)findViewById(R.id.buttonDrag)  ;		_Button.setOnTouchListener(new OnTouchListener() {			int lastX , lastY  ;			boolean isDraging  = false  ;						@Override			public boolean onTouch(View v, MotionEvent event) {				int ea = event.getAction()  ;				switch (ea) {				case MotionEvent.ACTION_DOWN:					isDraging = true ;					lastX = (int) event.getRawX()  ;					lastY = (int) event.getRawY()  ;					if(contentTop == 0) {						contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();//获取状态栏和标题栏的总高度					}					break;				case MotionEvent.ACTION_MOVE:					if(isDraging)					{						int dx = (int)event.getRawX() - lastX  ;						int dy = (int)event.getRawY() - lastY  ;												int l = v.getLeft() + dx  ;						int b = v.getBottom() + dy  ;						int r = v.getRight() + dx  ;						int t = v.getTop() + dy  ;												//推断超出屏幕						if(l<0)						{							l = 0 ;							r = v.getWidth()  ;						}						if(t<0)						{							t = 0 ;							b = v.getHeight()  ;						}						if(r>screenWidth)						{							r = screenWidth  ;							l = r - v.getWidth()  ;						}						if(b>screenHeight - contentTop)						{							b = screenHeight - contentTop ;							t = b - v.getHeight()  ;						}												v.layout(l, t, r, b)  ;						lastX = (int) event.getRawX()  ;						lastY = (int) event.getRawY()  ;						v.postInvalidate()  ;					}										break ;				case MotionEvent.ACTION_UP:					isDraging = false  ;					break ;				default:					break;				}				return false;			}		}) ;	}}
layout_simpledrag.xml

代码相对来说不是太复杂。这里就不多加解释了。仅仅说下开发过程中遇到的问题

1.view.getLeft、view.getRight、view.getTop、view.getBottom都是相对父view的位置。这里button的父view为我们定义的RelativeLayout,是不包含顶部状态栏和标题栏的。

这篇文章解说的非常具体

2.用下面代码測试我的小米手机(480*854)。获取的值为320*569

DisplayMetrics dm = getResources().getDisplayMetrics()  ;final int screenWidth = dm.widthPixels  ;final int screenHeight = dm.heightPixels  ;

解决的方法:

注: density 不等于1的情况下,须要设置targetSdkVersion在4-9之间,比如

须要在project的AndroidManifest.xml文件里,增加supports-screens节点。详细的内容例如以下:

研究之后发现,若没有设定多分辨率支持的话。Android系统会将240x320的低密度(120)和800x480以上的的高密度尺寸转换为中等密度(160)相应的尺寸
   

3.三种方式获取屏幕分辨率

(1)直接 int screenWidth = getWindowManager().getDefaultDisplay().getWidth();	int screenHeight = getWindowManager().getDefaultDisplay().getHeight();	(2)通过getResources()获取DisplayMetrics对象。DisplayMetrics dm = new DisplayMetrics();dm = getResources().getDisplayMetrics();screenWidth = dm.widthPixels;	screenHeight = dm.heightPixels;	(3)通过getWindowManager()获取dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);screenWidth = dm.widthPixels;	screenHeight = dm.heightPixels;

你可能感兴趣的文章
js-数组常用方法、
查看>>
django rest framework
查看>>
登录注册界面
查看>>
SQL Server去重和判断是否为数字——OBJECT_ID的使用
查看>>
poj1985 求树的直径
查看>>
【R语言系列】read.table报错incomplete final line found by readTableHeader
查看>>
最全基础区间线段树模板
查看>>
Linux的时间同步
查看>>
ORACLE中通过SQL语句(alter table)来增加、删除、修改字段
查看>>
20170623_oracle备份和恢复_常见问题
查看>>
面向接口、对象、方面编程区别 -- 精简版
查看>>
安装win10 和win中的一些杂项问题
查看>>
嵌入式web服务器appweb和其他web服务器(goahead、boa...)
查看>>
知其然不知其所以然的悲惨后果【EF CodeFirst 实体关系两日游】
查看>>
jvm内存快照dump文件太大,怎么分析
查看>>
python类的反射使用方法
查看>>
js判断手机还是pc并跳转相关页面
查看>>
移动开发之浅析cocos2d-x的中文支持问题
查看>>
文本框默认文字内容消失显示效果
查看>>
联合(Unions)
查看>>