使用三种方式绘制一张图片

在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View。

ImageView

1
mImageView.setBackgroundResource(R.mipmap.taylor);

SurfaceView

提供一个专注于绘制的,内嵌于view层的 surface。你可以控制这个surface的格式、尺寸。 SurfaceView 关心 surface是否显示在屏幕上的正确位置。

surface 在 Z轴是有序的,所以它是在拥有 SurfaceView的后面;就像是 SurfaceView在它的窗口上面一拳打了个洞,从而使 surface显示出来。视图层次结构将负责正确地合成Surface的通常出现在其上的任何同胞兄弟。这可用于在Surface上放置诸如按钮之类的叠加层,但请注意,它可能会影响性能,因为每次Surface变化时都会执行完整的alpha混合组合。

使 surface显示的透明区域是基于在视图层的布局位置。如果使用布局后转换属性在SurfaceView顶部绘制同级视图,则视图可能无法与表面正确合成。

通过SurfaceHolder接口提供对底层 surface的访问,可以通过调用 getHolder()来得到SurfaceHolder。

当SurfaceView的窗口可见时,将为您创建Surface ; 您应该实现 surfaceCreated(SurfaceHolder)surfaceDestroyed(SurfaceHolder) 来发现当窗口被显示和隐藏时Surface何时被创建和销毁。

这个类的目的之一是提供一个在辅助线程可以渲染到屏幕中的 surface。如果你要这样使用它,你需要知道一些线程语义:

  • 所有SurfaceView和 SurfaceHolder.Callback 方法都将从运行SurfaceView窗口的线程(通常是应用程序的主线程)中调用。因此它们需要与绘图线程所触及的任何状态正确同步。
  • 您必须确保绘图线程只在有效时触及底层Surface - 介于SurfaceHolder.Callback.surfaceCreated()SurfaceHolder.Callback.surfaceDestroyed()之间。

注意:从平台版本开N开始,SurfaceView的窗口位置将与其他视图渲染同步更新。这意味着在屏幕上平移和缩放SurfaceView不会导致渲染失真。当其窗口异步定位时,此类问题可能会出现在以前版本的平台上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {

if (surfaceHolder == null) {
return;
}

Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.taylor);
Canvas canvas = surfaceHolder.lockCanvas();
canvas.drawBitmap(bitmap, 0, 0, paint);
surfaceHolder.unlockCanvasAndPost(canvas);
}


@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

}


@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

}
});

自定义 View

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class CustomView extends View {

Paint paint = new Paint();
private final Bitmap bitmap;


public CustomView(Context context,
@Nullable AttributeSet attrs) {
super(context, attrs);

paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.taylor);
}


@Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, paint);
}
}
}

demo在github上的地址


Thanks

坚持原创技术分享,您的支持将鼓励我继续创作!