天天看点

可在屏幕上随意拖动的控件

源码下载地址:http://download.csdn.net/detail/qq_20489601/9591569

1.首先新建一个工具类MoveViewUtils,创建一个静态方法setMoveView(Context context, final View view)来设置要移动的控件,在方法中给控件view实现OnTouchListener接口。

package com.example.dragdemo;

import android.content.Context;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.view.WindowManager;

import android.widget.RelativeLayout;

import android.widget.RelativeLayout.LayoutParams;

public class MoveViewUtils {

protected static int screenWidth;

protected static int screenHeight;

protected static SharedPreferences sp;

public static void setMoveView(Context context, final View view) {
    WindowManager wm = (WindowManager) context
            .getSystemService(Context.WINDOW_SERVICE);
    screenWidth = wm.getDefaultDisplay().getWidth();
    screenHeight = wm.getDefaultDisplay().getHeight();
    sp = context.getSharedPreferences("config",  Context.MODE_PRIVATE);
    int lastx = sp.getInt("lastx", 0);
    int lasty = sp.getInt("lasty", 0);
    RelativeLayout.LayoutParams params = (LayoutParams) view
            .getLayoutParams();
    params.leftMargin = lastx;
    params.topMargin = lasty;
    view.setLayoutParams(params);

    view.setOnTouchListener(new OnTouchListener() {
        int startX;
        int startY;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:// 手指第一次触摸到屏幕
                this.startX = (int) event.getRawX();
                this.startY = (int) event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:// 手指移动
                int newX = (int) event.getRawX();
                int newY = (int) event.getRawY();

                int dx = newX - this.startX;
                int dy = newY - this.startY;

                // 计算出来控件原来的位置
                int l = view.getLeft();
                int r = view.getRight();
                int t = view.getTop();
                int b = view.getBottom();

                int newt = t + dy;
                int newb = b + dy;
                int newl = l + dx;
                int newr = r + dx;

                if ((newl < 0) || (newt < 0) || (newr > screenWidth)
                        || (newb > screenHeight)) {
                    break;
                }

                // 更新控件在屏幕的位置.
                view.layout(newl, newt, newr, newb);
                this.startX = (int) event.getRawX();
                this.startY = (int) event.getRawY();

                break;
            case MotionEvent.ACTION_UP: // 手指离开屏幕的一瞬间
                int lastx = view.getLeft();
                int lasty = view.getTop();
                Editor editor = sp.edit();
                editor.putInt("lastx", lastx);
                editor.putInt("lasty", lasty);
                editor.commit();
                break;
            }
            return true;
        }
    });
}
           

}

2.在mainActivity中进行调用:

package com.example.dragdemo;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class MainActivity extends Activity {

private TextView tv_move;

@Override

protected void onCreate( Bundle savedInstanceState ) {

super.onCreate( savedInstanceState );

this.setContentView( R.layout.activity_main );

tv_move = (TextView) findViewById(R.id.tv_move);

MoveViewUtils.setMoveView(this,tv_move);

}

}

源码下载地址:http://download.csdn.net/detail/qq_20489601/9591569

继续阅读