先上图看效果

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

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" />

须要在project的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动画-拖动的更多相关文章

  1. Android动画效果之自定义ViewGroup添加布局动画

    前言: 前面几篇文章介绍了补间动画.逐帧动画.属性动画,大部分都是针对View来实现的动画,那么该如何为了一个ViewGroup添加动画呢?今天结合自定义ViewGroup来学习一下布局动画.本文将通 ...

  2. Android动画效果之Property Animation进阶(属性动画)

    前言: 前面初步认识了Android的Property Animation(属性动画)Android动画效果之初识Property Animation(属性动画)(三),并且利用属性动画简单了补间动画 ...

  3. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  4. Android动画效果之Frame Animation(逐帧动画)

    前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame ...

  5. Android动画效果之Tween Animation(补间动画)

    前言: 最近公司项目下个版本迭代里面设计了很多动画效果,在以往的项目中开发中也会经常用到动画,所以在公司下个版本迭代开始之前,抽空总结一下Android动画.今天主要总结Tween Animation ...

  6. Android动画

    [浅谈Android动画] 总共四种:Tween Animation变换动画.Frame Animation帧动画 Layout Animation布局动画.Property Animation 属性 ...

  7. Android动画学习(二)——Tween Animation

    前两天写过一篇Android动画学习的概述,大致的划分了下Android Animation的主要分类,没有看过的同学请移步:Android动画学习(一)——Android动画系统框架简介.今天接着来 ...

  8. Android动画学习(一)——Android动画系统框架简介

    2015-11-09补充:Drawable Animation极有可能是Frame Animation 这几天在找工作,面试的时候被问到了Android动画,之前完全没接触过这部分,直接给懵了,当然其 ...

  9. Android动画的理解

    基础知识 在我们开始讲Android动画这个知识点之前,我们了解下相应的基础知识点. Shape篇 一般用Shape定义的XML文件是存放在Drawable目录下,广泛应用于在Button.TextV ...

随机推荐

  1. (2016北京集训十)【xsy1529】小Q与进位制 - 分治FFT

    题意很简单,就是求这个数... 其实场上我想出了分治fft的正解...然而不会打...然后打了个暴力fft挂了... 没啥好讲的,这题很恶心,卡常卡精度还爆int,要各种优化,有些dalao写的很复杂 ...

  2. tensorflow学习笔记(一)安装

    1.tensorflow介绍 中文社区地址 http://www.tensorfly.cn/ TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库. ...

  3. Qt之QTimer

    简述 QTimer类提供了重复和单次触发信号的定时器. QTimer类为定时器提供了一个高级别的编程接口.很容易使用:首先,创建一个QTimer,连接timeout()信号到适当的槽函数,并调用sta ...

  4. "pom.xml" could not be activated because it does not exist.

    "pom.xml" could not be activated because it does not exist. 在sts中使用maven build,输入package然后 ...

  5. Android4.2.2下Stagefright下OMX编解码器组件的控制流

    本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流. qq:1037701636 email:gzzaigcn2012@gmail.com Android源代码版本号Version ...

  6. Pleasant sheep and big big wolf

    pid=3046">点击打开链接 题目:在一个N * M 的矩阵草原上,分布着羊和狼.每一个格子仅仅能存在0或1仅仅动物.如今要用栅栏将全部的狼和羊分开.问怎么放,栅栏数放的最少,求出 ...

  7. iOS CST NSDate

    好像是从ios4.1開始[NSDate date];获取的是GMT时间,这个时间和北京时间相差8个小时.下面代码能够解决问题 - (void)tDate { NSDate *date = [NSDat ...

  8. MFC,C++,VC++,VS2010 之间究竟是什么关系

    C++是在C语言的基础上发展而来的面向对象的一种语言: MFC是基于C++类的窗口开发工具,内含大量的基类.降低编程人员的工作量: VC++是一种开发工具. VS2010是更高版本号的开发工具,功能强 ...

  9. 覆盖率測试工具gcov的前端工具_LCOV_简单介绍

    1.Gcov是进行代码运行的覆盖率统计的工具.它随着gcc的公布一起公布的,它的使用也非常easy,须要在编译和链接的时候加上-fprofile-arcs -ftest-coverage生成二进制文件 ...

  10. node04---fs文件操作、静态服务器

    08fs.js var http = require("http"); var fs = require("fs"); var server = http.cr ...