LinearLayout设置透明度:点击打开链接
悬浮框:https://www.jianshu.com/p/881403db1314
透明度设置主要是#50ffffff 50代表50%的透明度。
悬浮框最主要的有三个点。1.floatManager:自己创建的悬浮窗管理类。里面一般包含方法:addview,removeview,updateview。
/**
* 悬浮窗管理类
*/
public class FloatingManager {
private WindowManager mWindowManager;
private static FloatingManager mInstance;
private Context mContext;
public static FloatingManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new FloatingManager(context);
}
return mInstance;
}
private FloatingManager(Context context) {
mContext = context;
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);//获得WindowManager对象
}
/**
* 添加悬浮窗
* @param view
* @param params
* @return
*/
protected boolean addView(View view, WindowManager.LayoutParams params) {
try {
mWindowManager.addView(view, params);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 移除悬浮窗
* @param view
* @return
*/
protected boolean removeView(View view) {
try {
mWindowManager.removeView(view);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 更新悬浮窗参数
* @param view
* @param params
* @return
*/
protected boolean updateView(View view, WindowManager.LayoutParams params) {
try {
mWindowManager.updateViewLayout(view, params);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
2.创建一个悬浮窗的view视图,,悬浮窗长啥样就靠它了
/**
* 悬浮窗view
*/
public class FloatingView extends FrameLayout {
private Context mContext;
private View mView;
private ImageView mImageView;
private int mTouchStartX, mTouchStartY;//手指按下时坐标
private WindowManager.LayoutParams mParams;
private FloatingManager mWindowManager;
public FloatingView(Context context) {
super(context);
mContext = context.getApplicationContext();
LayoutInflater mLayoutInflater = LayoutInflater.from(context);
mView = mLayoutInflater.inflate(R.layout.floating_view, null);
mImageView = (ImageView) mView.findViewById(R.id.imageview);
mImageView.setImageResource(R.drawable.img_loading);
mImageView.setOnTouchListener(mOnTouchListener);
mWindowManager = FloatingManager.getInstance(mContext);
}
public void show() {
mParams = new WindowManager.LayoutParams();
mParams.gravity = Gravity.TOP | Gravity.LEFT;
mParams.x = 0;
mParams.y = 100;
//总是出现在应用程序窗口之上
mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
//设置图片格式,效果为背景透明
mParams.format = PixelFormat.RGBA_8888;
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
mParams.width = LayoutParams.WRAP_CONTENT;
mParams.height = LayoutParams.WRAP_CONTENT;
mWindowManager.addView(mView, mParams);
//逐帧动画
AnimationDrawable animationDrawable=(AnimationDrawable)mImageView.getDrawable();
animationDrawable.start();
}
public void hide() {
mWindowManager.removeView(mView);
}
private OnTouchListener mOnTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchStartX = (int) event.getRawX();
mTouchStartY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
mParams.x += (int) event.getRawX() - mTouchStartX;
mParams.y += (int) event.getRawY() - mTouchStartY;//相对于屏幕左上角的位置
mWindowManager.updateView(mView, mParams);
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
};
}
3.onToucheEvent这部分是悬浮框移动的部分,这个的质量决定了你的悬浮框能不能正常动起来
mView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
x = event.getRawX();
y = event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchStartX = event.getX();
mTouchStartY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
updateViewPosition();
break;
case MotionEvent.ACTION_UP:
updateViewPosition();
mTouchStartX=mTouchStartY=0;
break;
}
return true;
}
});
}
private void updateViewPosition(){
mParams.x = (int)(x-mTouchStartX);
mParams.y = (int)(y-mTouchStartY);
mWindowManager.updateView(mView,mParams);
}
这是我的部分代码,感觉写的很菜了,,但是居然能在网上找到比我还菜的,,让我瞬间有自信把我的代码贴了上来。
4.其他部分小细节:
首先是manifest文件里面添加权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
然后是WindowsManager里面的设置部分,,这块有点复杂我就不详说了(反正我写代码的时候是Ctrl+c和Ctrl+v了)。