android动画-拖动

先上图看效果

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

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/buttonDrag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        >
    </Button>

</RelativeLayout>

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

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

这篇文章讲解的很详细

http://blog.csdn.net/androiddevelop/article/details/8373782

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

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

解决办法:

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

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="10" />

需要在工程的AndroidManifest.xml文件中,加入supports-screens节点,具体的内容如下:

<supports-screens
            android:smallScreens="true"
            android:normalScreens="true"
            android:largeScreens="true"
            android:xlargeScreens="true"
            android:resizeable="true"
            android:anyDensity="true" />

研究之后发现,若没有设定多分辨率支持的话,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;

android动画-拖动

时间: 2024-10-01 04:01:21

android动画-拖动的相关文章

android动画具体解释六 XML中定义动画

动画View 属性动画系统同意动画View对象并提供非常多比view动画系统更高级的功能.view动画系统通过改变绘制方式来变换View对象,view动画是被view的容器所处理的,由于View本身没有要操控的属性.结果就是View被动画了.但View对象本身并没有变化. 在Android3.0中,新的属性和对应的getter和setter方法被增加以克服此缺点. 属性动画系统能够通过改变View对象的真实属性来动画Views. 并且.View也会在其属性改变时自己主动调用invalidate(

Android开发艺术探索——第七章:Android动画深入分析

Android开发艺术探索--第七章:Android动画深入分析 Android的动画可以分成三种,view动画,帧动画,还有属性动画,其实帧动画也是属于view动画的一种,,只不过他和传统的平移之类的动画不太一样的是表现形式上有点不一样,view动画是通过对场景的不断图像交换而产生的动画效果,而帧动画就是播放一大段图片,很显然,图片多了会OOM,属性动画通过动态的改变对象的属性达到动画效果,也是api11的新特性,在低版本无法使用属性动画,但是我们依旧有一些兼容库,OK,我们还是继续来看下详细

android 动画(1) 补间动画

android动画: 3.0以前,android支持两种动画模式,tween animation,frame animation, 3.0中又引入了一个新的动画系统:property animation, 这三种动画模式在SDK中被称为 property animation,        属性动画: view animation,   补间动画:  给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变. (Tween animation) drawable animatio

android动画详解三 动画API概述

· 属性动画与view动画的不同之处 view动画系统提供了仅动画View 对象的能力,所以如果你想动画非View 对象,你就要自己实现代码. view动画系统实际上还被强制仅能对 View 的少数属性进行动画,比如缩放和旋转,而不能对背景色进行. view动画的另一个坏处是它仅修改View的绘制位置,而不是View的实际位置.例如,如果你动画一个移动穿越屏幕,button的绘制位置是正确的,但实际你可以点击它的位置却没有变,所以你必须去实现你自己的逻辑来处理它. 使用属性动画系统时,这个限制被

Android动画基础

Android动画主要有三种: 1> 视图动画,也叫Tween(补间)动画可以在一个视图容器内执行一系列简单变换(位置.大小.旋转.透明度).譬如,如果你有一个TextView对象,您可以移动.旋转.缩放.透明度设置其文本,当然,如果它有一个背景图像,背景图像会随着文本变化. 补间动画通过XML或Android代码定义,建议使用XML文件定义,因为它更具可读性.可重用性. 2> Drawable动画其实就是Frame动画(帧动画),它允许你实现像播放幻灯片一样的效果,这种动画的实质其实是Dra

Android动画效果——1.帧动画2.补间动画3.跳转画面(三)

Android--动画效果1.帧动画2.补间动画3.跳转画面 插值器类 xml属性值 说明 LinearInterpolator @android:anim/linear_interpolatorr 动画以均匀的速度改变. AccelerateInterpolator @android:anim/accelerate_interpolator 在动画开始时改变速度较慢,然后开始加速. AccelerateDecelerateInterpolator @android:anim/accelerat

android 可拖动控件 ontouchevent

首先附上文章的转载内容的链接: 学习android 可拖动事件首先需要对android的屏幕和touchevent参数建立一个详细的知识结构. 1.android坐标系统 一.首先明确一下 android中的坐标系统 :屏幕的左上角是坐标系统原点(0,0),原点向右延伸是X轴正方向,原点向下延伸是Y轴正方向. 1.View的坐标     需要注意view的坐标是相对父容器而言的,包括:getTop().getBottom(),getLeft(),getRight().以getTop为例,函数源代

Android动画AnimationSet遇到的问题。

之前对Android动画这块一直是一知半解,知道个大概,并不会使用.刚好这几天没有太多的任务要做,可以梳理一下Android动画的一些知识.Android Animation的基础用法就不说了,这里主要记录下简单实用中遇到的问题. 1.XML中AnimationSet的某些属性有些问题. 主要就是android:repeatCount,android:repeatMode无效.这个问题据说是Google的工程师刻意为之.[参考:http://stackoverflow.com/questions

Android 动画详解

这次主要就介绍android动画,android动画目前分为三种形式,Tween Animation 这个只能应用于view对象上面的,Drawable Animation这个是帧动画,就是类似我们有一些列的图片依次播放图片时出现的动画,Property Animation 这个是属性动画,这也是在android3.0之后引进的动画,在手机的版本上是android4.0就可以使用这个动画,下面我们主要就是针对这三种情况进行介绍. Tween Animation 这个动画在Property Ani