Android自定义自定义APP全局悬浮按钮全局悬浮按钮
主要为大家详细介绍了Android自定义APP全局悬浮按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一
下
原本想通过framelayout实现一个悬浮在其他控件上的按钮,但是觉得很麻烦,需要各个界面都要动态填充.于是想到了悬浮窗,就
自定一个ImageView用于显示全局按钮.
一、首先因为悬浮窗式的所以要添加权限,对于SDK>=23的需要动态获取权限,我这边用的是22的
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
二、通过application获取到全局性的WindowManager的params数据
private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();
public WindowManager.LayoutParams getMywmParams(){
return wmParams;
}
三、自定义ImageView,并实现点击具有状态选择.其中写了一个回调接口用于对点击事件的处理
public class CustomeMovebutton extends ImageView {
private final int statusHeight;
int sW;
int sH;
private float mTouchStartX;
private float mTouchStartY;
private float x;
private float y;
private boolean isMove=false;
private Context context;
private WindowManager wm = (WindowManager) getContext().getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
private WindowManager.LayoutParams wmParams = ((MyApplication) getContext().getApplicationContext()).getMywmParams();
private float mLastX;
private float mLastY;
private float mStartX;
private float mStartY;
private long mDownTime;
private long mUpTime;
private OnSpeakListener listener;
public CustomeMovebutton(Context context) {
this(context,null);
this.context = context;
}
public CustomeMovebutton(Context context, AttributeSet attrs) {
this(context, attrs,-1);
}
public CustomeMovebutton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs,defStyleAttr);
sW = wm.getDefaultDisplay().getWidth();
sH = wm.getDefaultDisplay().getHeight();
statusHeight = getStatusHeight(context);
}
/**
* 状态栏的高度
*
*/
public static int getStatusHeight(Context context) {
int statusHeight = -1;
try {
Class clazz = Class.forName("com.android.internal.R$dimen"); //使用反射获取实例
Object object = clazz.newInstance();
int height = Integer.parseInt(clazz.getField("status_bar_height")
.get(object).toString());
statusHeight = context.getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
return statusHeight;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//获取相对屏幕的坐标,即以屏幕左上角为原点
x = event.getRawX();
y = event.getRawY() - statusHeight; //statusHeight是系统状态栏的高度
评论1