android 超简单的拖动按钮 悬浮按钮 吸附按钮

第一种

android 超简单的拖动按钮 悬浮按钮 吸附按钮_第1张图片  android 超简单的拖动按钮 悬浮按钮 吸附按钮_第2张图片

第二种

android 超简单的拖动按钮 悬浮按钮 吸附按钮_第3张图片  android 超简单的拖动按钮 悬浮按钮 吸附按钮_第4张图片

第一种实现方法

xml布局

    

Activity调用

DisplayMetrics dm = getResources().getDisplayMetrics();screenWidth = dm.widthPixels;screenHeight = dm.heightPixels;// Toast.makeText(getActivity(), screenWidth + "==" + screenHeight + "="// + vHeight, 0).show();// 拖动的按钮btn = (Button) view.findViewById(R.id.startBtn);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (bool) {LatestNetDataPackage lnPackage = new LatestNetDataPackage(R.string.COMMAND_LATESTNET, fundKind, sortType,requestType, curPage, FUND_COUNT, 0);dataPackage = lnPackage;NetWorkTaskManager.addRequestToRequestCache(lnPackage, HListViewFragment.this, HListViewFragment.this,getActivity());btn.setBackgroundResource(R.drawable.deletestock);bool = false;} else {LatestNetDataPackage lnPackage = new LatestNetDataPackage(R.string.COMMAND_LATESTNET, fundKind, sortType,requestType, curPage, FUND_COUNT, 1);dataPackage = lnPackage;NetWorkTaskManager.addRequestToRequestCache(lnPackage, HListViewFragment.this, HListViewFragment.this,getActivity());btn.setBackgroundResource(R.drawable.addstock);bool = true;}}});btn.setOnTouchListener(new OnTouchListener() {int lastX, lastY; // 记录移动的最后的位置private int btnHeight;public boolean onTouch(View v, MotionEvent event) {// 获取Actionint ea = event.getAction();switch (ea) {case MotionEvent.ACTION_DOWN: // 按下lastX = (int) event.getRawX();lastY = (int) event.getRawY();screenWidth = view.getWidth();screenHeight = view.getHeight();btnHeight = btn.getHeight();// Toast.makeText(getActivity(), "ACTION_DOWN:" + lastX + ",// " + lastY, 0).show();break;case MotionEvent.ACTION_MOVE: // 移动// 移动中动态设置位置int dx = (int) event.getRawX() - lastX;int dy = (int) event.getRawY() - lastY;int left = v.getLeft() + dx;int top = v.getTop() + dy;int right = v.getRight() + dx;int bottom = v.getBottom() + dy;if (left < 0) {left = 0;right = left + v.getWidth();}if (right > screenWidth) {right = screenWidth;left = right - v.getWidth();}if (top < 0) {top = 0;bottom = top + v.getHeight();}if (bottom > screenHeight) {bottom = screenHeight;top = bottom - v.getHeight();}v.layout(left, top, right, bottom);// Toast.makeText(getActivity(), "position:" + left + ", " +// top + ", " + right + ", " + bottom, 0)// .show();// 将当前的位置再次设置lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;case MotionEvent.ACTION_UP: // 抬起// 向四周吸附//int dx1 = (int) event.getRawX() - lastX;//int dy1 = (int) event.getRawY() - lastY;//int left1 = v.getLeft() + dx1;//int top1 = v.getTop() + dy1;//int right1 = v.getRight() + dx1;//int bottom1 = v.getBottom() + dy1;//if (left1 < (screenWidth / 2)) {//if (top1 < 100) {//v.layout(left1, 0, right1, btnHeight);//} else if (bottom1 > (screenHeight - 200)) {//v.layout(left1, (screenHeight - btnHeight), right1, screenHeight);//} else {//v.layout(0, top1, btnHeight, bottom1);//}//} else {//if (top1 < 100) {//v.layout(left1, 0, right1, btnHeight);//} else if (bottom1 > (screenHeight - 200)) {//v.layout(left1, (screenHeight - btnHeight), right1, screenHeight);//} else {//v.layout((screenWidth - btnHeight), top1, screenWidth, bottom1);//}//}//break;}return false;}});
view指的是布局

第二种实现方法

xml布局

                    

自定义控件 com.ui.view.DragFrameLayout

package com.ui.view;import com.ui.R;import android.content.Context;import android.graphics.Rect;import android.location.Location;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.ViewConfiguration;import android.widget.FrameLayout;public class DragFrameLayout extends FrameLayout {private View view;private int width, heigh;private int screenWid, screenHei;private boolean isClickDrag = false;private boolean isTouchDrag = false;private float startX, startY;private CheckClick checkClick = new CheckClick();private DragImageClickListener dragImageListener;public DragImageClickListener getDragImageListener() {return dragImageListener;}public void setDragImageListener(DragImageClickListener dragImageListener) {this.dragImageListener = dragImageListener;}public interface DragImageClickListener {public abstract void onClick();}private class CheckClick implements Runnable {@Overridepublic void run() {// TODO Auto-generated method stubisClickDrag = false;Log.i("drag", "=====checkTap====");}}public DragFrameLayout(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}public DragFrameLayout(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public void dragInit(View view) {screenWid = getWidth();screenHei = getHeight();width = view.getWidth();heigh = view.getHeight();}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {// TODO Auto-generated method stubswitch (ev.getAction()) {case MotionEvent.ACTION_DOWN:float x = ev.getX();float y = ev.getY();Rect frame = new Rect();if (view == null) {view = findViewById(R.id.dragImg);dragInit(view);}view.getHitRect(frame);if (frame.contains((int) (x), (int) (y))) {isTouchDrag = true;startX = x;startY = y;return true;}break;}return false;}@Overrideprotected void onLayout(boolean changed, int left, int top, int right,int bottom) {super.onLayout(changed, left, top, right, bottom);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubfloat x = event.getX();float y = event.getY();Rect frame = new Rect();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:view.getHitRect(frame);if (frame.contains((int) (x), (int) (y))) {startX = x;startY = y;isTouchDrag = true;isClickDrag = true;postDelayed(checkClick, ViewConfiguration.getTapTimeout());}break;case MotionEvent.ACTION_MOVE:float distanX = Math.abs(x - startX);float distanY = Math.abs(y - startY);if (Math.sqrt(distanY * distanY + distanX * distanX) > 10) {isClickDrag = false;}move(x, y);break;case MotionEvent.ACTION_CANCEL:isClickDrag = false;isTouchDrag = false;break;case MotionEvent.ACTION_UP:if (isClickDrag == true) {dragImageListener.onClick();removeCallbacks(checkClick);}isClickDrag = false;isTouchDrag = false;// 这段是把控件吸附四周//if (x > width && x < screenWid - width && y > heigh//&& y < screenHei -  heigh) {//int minType = minDIstance(x, y);//Log.i("tags", screenHei + "==mintype=" + minType);//switch (minType) {//case LEFT://x = width;//break;//case RIGHT://x = screenWid - width;//break;//case TOP://y = heigh;//break;//case BOTTOM://y = screenHei - heigh;//break;//default://break;//}//move(x, y);//}break;case MotionEvent.ACTION_OUTSIDE:isClickDrag = false;isTouchDrag = false;break;}return true;}private final static int LEFT = 1;private final static int RIGHT = 2;private final static int TOP = 3;private final static int BOTTOM = 4;private int minDIstance(float x, float y) {Log.i("tags", "x=" + x + "==y=" + y);boolean left, top;if (x <= (screenWid - x)) {left = true;} else {left = false;}if (y <= (screenHei - y)) {top = true;} else {top = false;}if(left&&top){if(x<=y){return LEFT;}else{return TOP;}}if(left&&(!top)){if(x<=(screenHei-y)){return LEFT;}else{return BOTTOM;}}if((!left)&top){if((screenWid-x)<= y){return RIGHT;}else{return TOP;}}if((!left)&(!top)){if((screenWid-x)<= (screenHei-y)){return RIGHT;}else{return BOTTOM;}}return 0;}private void move(float x, float y) {int left = (int) (x - width / 2);int top = (int) (y - heigh / 2);if (left <= 0)left = 0;if (top <= 0)top = 0;if (left > screenWid - width)left = screenWid - width;if (top > screenHei - heigh)top = screenHei - heigh;FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams();params.setMargins(left, top, (screenWid - left - width), (screenHei- top - heigh));view.setLayoutParams(params);requestLayout();}public double getDistance(double lat1, double lon1, double lat2, double lon2) {float[] results = new float[1];Location.distanceBetween(lat1, lon1, lat2, lon2, results);return results[0];}}

Activity调用方法

dragImg = (ImageView)findViewById(R.id.dragImg);frameLayout = (DragFrameLayout)findViewById(R.id.becausefloat);frameLayout.setDragImageListener(new DragImageClickListener() {private boolean isDaix;@Overridepublic void onClick() {// TODO Auto-generated method stubif (isDaix) {dragImg.setBackgroundResource(R.drawable.deletestock);isDaix = false;} else {dragImg.setBackgroundResource(R.drawable.addstock);isDaix = true;}Toast.makeText(MainActivity.this, "点击",Toast.LENGTH_LONG).show();}});



更多相关文章

  1. android 五种 布局文件
  2. Android Studio 新建编辑条 点击按钮显示控件中的内容
  3. android 组件,xml布局中属性详解
  4. android 坐标布局 AbsoluteLayout
  5. Android基础知识:Day02 常见布局、logcat相关和文件读写
  6. 布局概述之相对布局RelativeLayout

随机推荐

  1. android中Acticity之间的跳转
  2. Android 定时重启Android系统源(手机root
  3. Application has stopped unexpectedly.
  4. Android中Json应用实例介绍
  5. android camera(4)
  6. 我的词典:即粘即用二
  7. Android(安卓)camera拍照分辨率
  8. Android(安卓)选择城市,选择联系人,自定义
  9. android ndk生成so库
  10. Android(私有,公有)进程,系统中的进程管理