叶子自律成长营

所有的大道理都是建立在努力和奋斗的基础上

2019-02-28  本文已影响3人  Eren丶耶格尔

日结| 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,然后在手指所在位置画一个圆圈,把圆圈部分的图像显示出来。

上一篇 下一篇

猜你喜欢

热点阅读