Android 实现一个可拖动的可点击悬浮按钮


项目上要实现一个可以拖动的悬浮按钮,参考别人的示例代码,自己实现了一个

 

//一下是代码

/**
*
* @author liuxiangfei
* Description: 显示悬浮框的控制类
*/
public class DragViewCtr {

private static final int MOVE_LENGH = 150;

private int screenHeight;
private int screenWidth;
/**
* 被拖动的图
*/
private ImageButton iv_drag;
private SharedPreferences sp;
private Activity activity;

public DragViewCtr(Activity activity) {
this.activity = activity;
this.screenHeight = activity.getWindowManager().getDefaultDisplay()
.getHeight();
this.screenWidth = activity.getWindowManager().getDefaultDisplay()
.getWidth();

ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
LayoutInflater factory = LayoutInflater.from(activity);
View layout = factory.inflate(R.layout.draglayout, null);
decorView.addView(layout);

this.iv_drag = (ImageButton) layout.findViewById(R.id.imageview_drag);

this.sp = activity.getSharedPreferences("config", Context.MODE_PRIVATE);
}
/**
* 显示可拖动的客服电话图标
*/
public void showDragCallView() {

this.iv_drag.setVisibility(View.VISIBLE);
DisplayMetrics metric = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
iv_drag.measure(w, h);
int viewheight =iv_drag.getMeasuredHeight();
int viewwidth =iv_drag.getMeasuredWidth();
int lastx = this.sp.getInt("lastx", width-viewwidth-30);
int lasty = this.sp.getInt("lasty", height-viewheight-50);

RelativeLayout.LayoutParams params = (LayoutParams) this.iv_drag
.getLayoutParams();
params.leftMargin = lastx;
params.topMargin = lasty;
this.iv_drag.setLayoutParams(params);

this.iv_drag.setOnTouchListener(new OnTouchListener() {
int startX;
int startY;
long downTime;
long upTime;

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:// 手指第一次触摸到屏幕
iv_drag.setBackgroundResource(R.drawable.setting_cusromer_drag_down);
this.startX = (int) event.getRawX();
this.startY = (int) event.getRawY();
downTime = System.currentTimeMillis();
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 = iv_drag.getLeft();
int r = iv_drag.getRight();
int t = iv_drag.getTop();
int b = iv_drag.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;
}

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

break;
case MotionEvent.ACTION_UP: // 手指离开屏幕的一瞬间

int lastx = iv_drag.getLeft();
int lasty = iv_drag.getTop();
upTime = System.currentTimeMillis();
android.util.Log.e("startX", "" + startX);
android.util.Log.e("startY", "" + startY);
android.util.Log.e("lastx", "" + lastx);
android.util.Log.e("lasty", "" + lasty);
if (Math.abs(lastx - startX) < MOVE_LENGH
&& Math.abs(lasty - startY) < MOVE_LENGH
&& (upTime - downTime) < 150l) {
call();
}
Editor editor = sp.edit();
editor.putInt("lastx", lastx);
editor.putInt("lasty", lasty);
editor.commit();
iv_drag.setBackgroundResource(R.drawable.setting_cusromer_drag);
break;
}
return true;
}
});
}

/**
*
*/
public void hideDragCallView() {

this.iv_drag.setVisibility(View.GONE);
}
/**
* 打电话
*/
private void call() {
Toast.makeText(activity, "拨打电话", Toast.LENGTH_LONG).show();
}

}

 

//主页

public class MainActivity extends Activity {

@Override
protected void onCreate( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);

this.setContentView( R.layout.activity_main );
}

@Override
protected void onResume() {
super.onResume();
DragViewCtr ctr = new DragViewCtr(this);
ctr.showDragCallView();
}

public void btnTest(View v){
Toast.makeText(MainActivity.this, "点击按钮",
Toast.LENGTH_LONG).show();
}

}

 

//布局文件

<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<Button
android:layout_alignParentBottom="true"
android:layout_width="60dp"
android:layout_height="50dp"
android:text="按钮"
android:onClick="btnTest" />

</RelativeLayout>

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<ImageButton
android:id="@+id/imageview_drag"
android:layout_width="50dp"
android:layout_height="50dp"
android:contentDescription="@null"
android:background="@drawable/setting_server_drag_call" />

</RelativeLayout>

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM