• 画布之ShapeDrawable


    package com.loaderman.customviewdemo;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Rect;
    import android.graphics.Region;
    import android.graphics.drawable.ShapeDrawable;
    import android.util.AttributeSet;
    import android.view.View;
    
    
    public class ShapeView extends View {
        private ShapeDrawable mShapeDrawable;
        public ShapeView(Context context) {
            super(context);
            init();
        }
    
        public ShapeView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public ShapeView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }
    
        private void init(){
            setLayerType(LAYER_TYPE_SOFTWARE,null);
    //        //RectShape
    //        mShapeDrawable = new ShapeDrawable(new RectShape());
    //        mShapeDrawable.setBounds(new Rect(50,50,200,100));
    //        mShapeDrawable.getPaint().setColor(Color.YELLOW);
    
    //        //OvalShape
    //        mShapeDrawable = new ShapeDrawable(new OvalShape());
    //        mShapeDrawable.setBounds(new Rect(50,50,200,100));
    //        mShapeDrawable.getPaint().setColor(Color.YELLOW);
    
    //       //ArcShape 15968145727
    //        mShapeDrawable = new ShapeDrawable(new ArcShape(0,300));
    //        mShapeDrawable.setBounds(new Rect(50,50,200,100));
    //        mShapeDrawable.getPaint().setColor(Color.YELLOW);
    
    //        //RoundRectShape
    //        float[] outerR = new float[] { 12, 12, 12, 12, 0, 0, 0, 0 };
    //        RectF inset = new RectF(6, 6, 6,6);
    //        float[] innerR = new float[] { 50, 12, 0, 0, 12, 50, 0, 0 };
    //        mShapeDrawable = new ShapeDrawable(new RoundRectShape(outerR,inset,innerR));
    //        mShapeDrawable.setBounds(new Rect(50,50,200,100));
    //        mShapeDrawable.getPaint().setColor(Color.BLACK);
    
    //        //PathShape
    //        Path path = new Path();
    //        path.moveTo(0,0);
    //        path.lineTo(100,0);
    //        path.lineTo(100,100);
    //        path.lineTo(0,100);
    //        // 封闭前面点所绘制的路径
    //        path.close();
    //        mShapeDrawable = new ShapeDrawable(new PathShape(path,100,200));
    //        mShapeDrawable.setBounds(new Rect(0,0,250,150));
    //        mShapeDrawable.getPaint().setColor(Color.YELLOW);
    
            //ReginShape
            //构造两个矩形
            Rect rect1 = new Rect(50,0,90,150);
            Rect rect2 = new Rect(0,50,250,100);
            //构造两个Region
            Region region = new Region(rect1);
            Region region2= new Region(rect2);
            //取两个区域的交集
            region.op(region2, Region.Op.XOR);
            mShapeDrawable = new ShapeDrawable(new RegionShape(region));
            mShapeDrawable.setBounds(new Rect(0,0,200,100));
            mShapeDrawable.getPaint().setColor(Color.YELLOW);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            mShapeDrawable.draw(canvas);
        }
    }
    package com.loaderman.customviewdemo;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.BitmapShader;
    import android.graphics.Canvas;
    import android.graphics.Matrix;
    import android.graphics.Shader;
    import android.graphics.drawable.ShapeDrawable;
    import android.graphics.drawable.shapes.OvalShape;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    
    
    public class TelescopeView extends View {
        private Bitmap bitmap;
        private ShapeDrawable drawable;
    // 放大镜的半径
    
        private static final int RADIUS = 80;
    // 放大倍数
    
        private static final int FACTOR = 3;
        private final Matrix matrix = new Matrix();
    
        public TelescopeView(Context context) {
            super(context);
            init();
        }
    
        public TelescopeView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public TelescopeView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }
    
    
        private void init() {
            setLayerType(LAYER_TYPE_SOFTWARE, null);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            final int x = (int) event.getX();
            final int y = (int) event.getY();
            // 这个位置表示的是,画shader的起始位置
            matrix.setTranslate(RADIUS - x * FACTOR, RADIUS - y * FACTOR);
            drawable.getPaint().getShader().setLocalMatrix(matrix);
    
            // bounds,就是那个圆的外切矩形
            drawable.setBounds(x - RADIUS, y - RADIUS, x + RADIUS, y + RADIUS);
            invalidate();
            return true;
        }
    
        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            if (bitmap == null) {
                Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.scenery);
                bitmap = Bitmap.createScaledBitmap(bmp, getWidth(), getHeight(), false);
    
                BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(bitmap,
                        bitmap.getWidth() * FACTOR, bitmap.getHeight() * FACTOR, true),
                        Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
                drawable = new ShapeDrawable(new OvalShape());
                drawable.getPaint().setShader(shader);
                drawable.setBounds(0, 0, RADIUS * 2, RADIUS * 2);
            }
    
            canvas.drawBitmap(bitmap, 0, 0, null);
            drawable.draw(canvas);
    
    
        }
    
    }

    效果:

  • 相关阅读:
    面向对象的特征有哪些方面?
    构造器(constructor)是否可被重写(override)?
    swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
    Java的运算符
    staitc关键字
    final关键字
    java的基本知识技能(二)
    java的基本操作和基本知识技能
    java概述------
    java中有几种方法实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
  • 原文地址:https://www.cnblogs.com/loaderman/p/10220480.html
Copyright © 2020-2023  润新知