Android全屏悬浮窗画布,使用WindowManager添加View——悬浮窗口的基本原理

这个博客展示了如何在Android中创建一个自定义的MyView类,该类继承自SurfaceView并实现了SurfaceHolder.Callback接口。作者通过重写onDraw()方法来绘制Bitmap,并使用线程动态改变图片位置和透明度,实现了一种简单的动画效果。主要涉及到Android的图形绘制、动画处理和视图生命周期管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@SuppressLint("WrongCall")

public class MyView extends SurfaceView implements SurfaceHolder.Callback {

private static int span = 5;

private MyThread wtf;

private Paint paint;

int sleepSpan = 150; // 动画的时延ms

Bitmap logo_s, logo_l; // logo图片引用

int width_s; // 图片大小

int height_s;

float currentX_s; // 图片位置

float currentY_s;

float currentX_l; // 图片位置

float currentY_l;

private Rect src;

private RectF dst;

private int currentAlpha = 0;

public MyView(Context context) {

super(context);

this.getHolder().addCallback(this);// 设置生命周期回调接口的实现者

paint = new Paint();// 创建画笔

paint.setAntiAlias(true);// 打开抗锯齿

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

logo_s = BitmapFactory

.decodeResource(getResources(), R.drawable.logo_s);

logo_l = BitmapFactory

.decodeResource(getResources(), R.drawable.logo_l);

// TODO Auto-generated method stub

width_s = logo_s.getWidth();

height_s = logo_s.getHeight();

src = new Rect(0, 0, 0, height_s);

// 大图片的位置

currentX_s = 5;

currentY_s = 5;

dst = new RectF(currentX_s, currentY_s, currentX_s, currentY_s

+ height_s);

currentX_l = currentX_s + width_s - logo_l.getWidth();

// 小图片的位置

currentY_l = currentY_s + height_s;

currentAlpha = 0;

wtf = new MyThread();

wtf.start();

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

// TODO Auto-generated method stub

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO Auto-generated method stub

}

@Override

public void onDraw(Canvas canvas) {

// TODO Auto-generated method stub

// 绘制黑填充矩形清背景

super.onDraw(canvas);

paint.setAlpha(120);// 设置不透明度为255

paint.setColor(Color.BLACK);// 设置画笔颜色

canvas.drawColor(Color.BLACK);

// 进行平面贴图

if (logo_s == null || logo_l == null)

return;

src.right += span;

dst.right += span;

canvas.drawBitmap(logo_s, src, dst, paint);

paint.setAlpha(currentAlpha);

canvas.drawBitmap(logo_l, currentX_l, currentY_l, paint);

// canvas.drawBitmap(bitmap, src, dst, paint);

/*

* Rect src = new Rect(x1, y2, cx1,cy1); Rect dst = new Rect(x2, y2,

* cx2, cy2); 第一个矩形,是你想截取的bitmap里面的哪一段。 第二个矩形,是你想显示在屏幕上的什么位置。

* 两个矩形可以不一样大小,在绘制的时候,会自动拉伸。

*/

}

class MyThread extends Thread {

public void run() {

SurfaceHolder mholder = MyView.this.getHolder();// 获取回调接口

// 绘制tatans

try {

sleep(500);

} catch (InterruptedException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

for (int i = 0; i <= width_s / span; i++) {

Canvas canvas = mholder.lockCanvas();// 获取画布

try {

synchronized (mholder) // 同步

{

onDraw(canvas);// 进行

}

sleep(20);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

if (canvas != null) {

mholder.unlockCanvasAndPost(canvas);

}

}

}

// 绘制天坦智慧

for (int i = 0; i <= 25; i++) {

currentAlpha = i * 10;

Canvas canvas = mholder.lockCanvas();// 获取画布

try {

synchronized (mholder) // 同步

{

onDraw(canvas);// 进行

}

sleep(25);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

if (canvas != null) {

mholder.unlockCanvasAndPost(canvas);

}

}

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值