日结| Day30
所有的大道理都是建立在努力和奋斗的基础上的
早起
6点50准时起床,阅读新书《摆渡人》
运动
俯卧撑:3组20个,哑铃:3组10个,深蹲:3组10个
阅读
阅读《摆渡人》
学习
《自定义控件》第七章 Shader 和 BitmapShader
Shader 在三维软件中被称为着色器,是用来给空白图形上色的。
案例:望远镜效果
原理:
先准备一张背景图,然后将背景图作为 BitmapShader,只需要在手指所在位置画一个圆,就可以将圆形部分的图像显示出来了。
代码如下所示:
public class TelescopeView extends View {
private Paint paint;
private Bitmap bitmap, bitmapGg;
private int dx, dy;
public TelescopeView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.bg);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
dx = (int) event.getX();
dy = (int) event.getY();
postInvalidate();
return true;
case MotionEvent.ACTION_MOVE:
dx = (int) event.getX();
dy = (int) event.getY();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
dx = -1;
dy = -1;
break;
}
postInvalidate();
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (bitmapGg == null) {
bitmapGg = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvasBg = new Canvas(bitmapGg);
canvasBg.drawBitmap(bitmap, null, new Rect(0, 0, getWidth(), getHeight()), paint);
}
if (dx != -1 && dy != -1) {
paint.setShader(new BitmapShader(bitmapGg, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT));
canvas.drawCircle(dx, dy, 150, paint);
}
}
}
这里分两步:
第一步,将图片缩放到控件大小,以完全覆盖控件,否则就会使用 BitmapShader 的填充模式。这里先新建一张空白的位图,这张位图的大小与控件的大小一样,然后对背景图进行拉伸,画到这张空白的位图上。之所以在 onDraw() 函数中创建 bitmapGg,而不在初始化代码中创建,是因为在初始化时,getWidth() 和 getHeight() 函数是获取不到值的。
第二步,在 dx、dy 都不是 -1 时(手指下按或移动时),将新建的 bitmapBg 作为 BitmapShader 设置给 paint,然后在手指所在位置画一个圆圈,把圆圈部分的图像显示出来。
网友评论