mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

先上图看效果


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

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;


posted on 2017-06-11 16:10  mthoutai  阅读(308)  评论(0编辑  收藏  举报