你的App颜值,决定了用户会不会用第二次。
一、Android图形系统基础
在深入代码之前,了解Android图形系统的基本架构至关重要。Android图形栈是一个复杂的系统,包含应用层、系统服务层、硬件抽象层和内核层。
应用层使用Canvas、OpenGL ES、Vulkan和Skia进行绘制,系统服务层通过SurfaceFlinger合成所有应用的窗口表面,WindowManager管理窗口层级、位置和Z-order。
每一个绘图操作都是在Surface上进行的,它是应用程序绘图的目标缓冲区。多个Surface通过BufferQueue生产者和消费者模式传递到SurfaceFlinger,最终合成为一帧输出到显示屏。
二、基础绘图技术
1. 自定义View与Canvas绘制
最简单的绘图方式是继承View类并重写它的onDraw()方法。在这个方法中,你可以使用Canvas(画布)和Paint(画笔)来进行绘制。
public class CustomView extends View {
private Paint mPaint;
public CustomView(Context context) {
super(context);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 绘制一个红色圆形
canvas.drawCircle(getWidth() / 2, getHeight() / 2, 100, mPaint);
}
}
Canvas类提供了丰富的方法:drawLine、drawRect、drawCircle、drawOval、drawArc用于绘制基本形状,drawPath用于绘制自定义路径,drawBitmap用于绘制位图,drawText用于绘制文本。
Paint类则决定了绘制内容的样式,你可以设置颜色、样式(填充或描边)、描边宽度、文本大小、字体等属性。通过启用抗锯齿(setAntiAlias),可以让图形的边缘更加平滑。
2. 图形刷新与线程安全
当需要更新界面时,我们会调用invalidate()或postInvalidate()方法触发重绘。但要注意,invalidate()只能在UI线程调用,而postInvalidate()可以在任何线程中调用。
对于需要频繁更新的图形,我们可以创建一个专门的绘图线程:
public class DrawingThread extends Thread {
private volatile boolean isRunning = false;
private CustomView mView;
public DrawingThread(CustomView view) {
mView = view;
}
public void setRunning(boolean running) {
isRunning = running;
}
@Override
public void run() {
while (isRunning) {
// 更新图形状态
// 触发重绘
mView.postInvalidate();
try {
Thread.sleep(16); // 约60fps
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
三、图像处理技术
1. Bitmap加载与内存管理
Bitmap是Android中处理图像的核心类,但它也是内存消耗的大户。不正确的Bitmap管理很容易导致OutOfMemoryError。
加载Bitmap时,一定要使用BitmapFactory.Options来优化内存使用:<

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



