Android实现微信悬浮窗
本人因为时间有限,没有完全自己写,结合两个第三方库,并在其基础上进行修改的,若有感兴趣的可以去自己研究源码,本人只做记录,方便之后查看
准备材料
- 开启悬浮窗https://github.com/princekin-f/EasyFloat
- 实现类似于QQ分组头像的功能https://github.com/YiiGuxing/CompositionAvatar
开始制作
- 我们先把CompositionAvatarView复制粘贴到本地,你也可以直接用,因为需求原因需要改代码,然后引入悬浮窗三方库,实现悬浮窗代码
EasyFloat.with(MainActivity.this)
.setSidePattern(SidePattern.RESULT_HORIZONTAL)
.setGravity(Gravity.END | Gravity.BOTTOM, 0, -200)
.setLayout(R.layout.float_custom, view -> {
mLocation[0] = 1;
mLocation[1] = 3;
CompositionAvatarView avatarView = view.findViewById(R.id.web_composition);
Drawable drawable = new DrawableCreator.Builder().setCornersRadius(DensityUtils.dip2px(MainActivity.this, 40),
0, DensityUtils.dip2px(MainActivity.this, 40), 0)
.setStrokeWidth(DensityUtils.dip2px(MainActivity.this, 0.5f))
.setSolidColor(Color.parseColor("#EEDDDDDD"))
.setStrokeColor(Color.WHITE)
.build();
avatarView.setPadding(DensityUtils.dip2px(MainActivity.this, 10), DensityUtils.dip2px(MainActivity.this, 10), DensityUtils.dip2px(MainActivity.this, 10), DensityUtils.dip2px(MainActivity.this, 10));
view.findViewById(R.id.web_composition).setBackground(drawable);
for (Drawable drawable1 : mDrawables) {
avatarView.addDrawable(drawable1);
}
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onRelationClick();
}
});
}).registerCallbacks(new OnFloatCallbacks() {
@Override
public void createdResult(boolean b, @org.jetbrains.annotations.Nullable String s, @org.jetbrains.annotations.Nullable View view) {
}
@Override
public void show(@NotNull View view) {
}
@Override
public void hide(@NotNull View view) {
}
@Override
public void dismiss() {
}
@Override
public void touchEvent(@NotNull View view, @NotNull MotionEvent motionEvent) {
}
@Override
public void drag(@NotNull View view, @NotNull MotionEvent motionEvent) {
view.setPadding(DensityUtils.dip2px(MainActivity.this, 2), DensityUtils.dip2px(MainActivity.this, 2), DensityUtils.dip2px(MainActivity.this, 2), DensityUtils.dip2px(MainActivity.this, 2));
Drawable drawable = new DrawableCreator.Builder().setCornersRadius(DensityUtils.dip2px(MainActivity.this, 40))
.setStrokeWidth(DensityUtils.dip2px(MainActivity.this, 0.5f))
.setSolidColor(Color.parseColor("#EEDDDDDD"))
.setStrokeColor(Color.WHITE)
.build();
view.findViewById(R.id.web_composition).setPadding(DensityUtils.dip2px(MainActivity.this, 10), DensityUtils.dip2px(MainActivity.this, 10), DensityUtils.dip2px(MainActivity.this, 10), DensityUtils.dip2px(MainActivity.this, 10));
view.findViewById(R.id.web_composition).setBackground(drawable);
}
@Override
public void dragEnd(@NotNull View view) {
view.getLocationOnScreen(mLocation);
Drawable drawable;
if (mLocation[0] > 0) {
drawable = new DrawableCreator.Builder().setCornersRadius(DensityUtils.dip2px(MainActivity.this, 40),
0, DensityUtils.dip2px(MainActivity.this, 40), 0)
.setStrokeWidth(DensityUtils.dip2px(MainActivity.this, 0.5f))
.setSolidColor(Color.parseColor("#EEDDDDDD"))
.setStrokeColor(Color.WHITE)
.build();
} else {
drawable = new DrawableCreator.Builder().setCornersRadius(0,
DensityUtils.dip2px(MainActivity.this, 40), 0, DensityUtils.dip2px(MainActivity.this, 40))
.setStrokeWidth(DensityUtils.dip2px(MainActivity.this, 0.5f))
.setSolidColor(Color.parseColor("#EEDDDDDD"))
.setStrokeColor(Color.WHITE)
.setGradientAngle(90)
.setGradientColor(Color.parseColor("#FFE02020"), Color.parseColor("#FFE02020"))
.setGradientRadius(DensityUtils.dip2px(MainActivity.this, 5))
.build();
}
view.findViewById(R.id.web_composition).setPadding(DensityUtils.dip2px(MainActivity.this, 10), DensityUtils.dip2px(MainActivity.this, 10), DensityUtils.dip2px(MainActivity.this, 10), DensityUtils.dip2px(MainActivity.this, 10));
view.findViewById(R.id.web_composition).setBackground(drawable);
}
}).show();
- 然后就是在onLayoutClick() 就可以进行自己的处理了