第一种

  

第二种

  

第一种实现方法

xml布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:id="@+id/startBtn"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_centerInParent="true"
android:background="@drawable/addstock" /> </RelativeLayout>

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() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (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) {
// 获取Action
int 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
android:id="@+id/becausefloat"
android:layout_width="fill_parent"
android:layout_height="0.0dp"
android:layout_gravity="center_vertical"
android:layout_weight="1" > <FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" /> <ImageView
android:id="@+id/dragImg"
android:layout_width="35dp"
android:layout_height="35dp"
android:background="@drawable/deletestock" />
</com.ui.view.DragFrameLayout>

自定义控件 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 { @Override
public void run() {
// TODO Auto-generated method stub
isClickDrag = 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();
} @Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
switch (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;
} @Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) { super.onLayout(changed, left, top, right, bottom); } @Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
float 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; @Override
public void onClick() {
// TODO Auto-generated method stub
if (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. angular2系列教程(八)In-memory web api、HTTP服务、依赖注入、Observable
  2. nodejs+express+mysql 增删改查
  3. zTree控件的使用
  4. 面对一个新的MCU,我再也不敢说第一步是点灯了
  5. java 20 - 4 IO流概述和一个简单例子解析
  6. C#之猴子吃桃儿问题的解法——猴子吐桃儿
  7. SonarLint插件的安装与使用
  8. android学习笔记25——事件处理Handler
  9. RIA技术
  10. Linux 下常用命令
  11. USB HID报告及报告描述符简介
  12. Http get,post,soap协议的区别
  13. IE8下提示&amp;#39;console&amp;#39;没有定义错误
  14. THE MATRIX PROBLEM
  15. JSJ—类与对象
  16. string函数的一些实现
  17. C templet and switch case with serial number
  18. actionBar_Tab导航
  19. Eclipse解决运行、启动缓慢问题思路
  20. PHP 与 UTF-8

热门文章

  1. 用js刷剑指offer(斐波那契数列)
  2. iis深入学习资源
  3. linq学习(二)
  4. python学习之基础入门,安装,字符串,数据转换,三元运算符
  5. Python+request 登录接口reponse中token传递给其他接口使用,小示例介绍《一》
  6. C# 截图不失真
  7. python 杂记 网络
  8. js代码加这个&lt;!--代码//--&gt;
  9. MVC路由规则进一步了解
  10. python原生操作mysql