Android 高级UI6 高级渲染

Android 高级UI 目录
Paint 画笔的高级技能
渲染 Shader:
BitmapShader位图的图象渲染器
LinearGradient线性渲染
RadialGradient环形渲染
SweepGradient梯度渲染(扫描渲染)
ComposeShader组合渲染

可以绘制图片、颜色块、文字
canvas.drawCircle()
canvas.drawRect()
canvas.drawOval()

public class LinearGradientTextView extends android.support.v7.widget.AppCompatTextView {


   private TextPaint paint;

   private LinearGradient linearGradient;

   private Matrix matrix;

   private float translateX;

   private float deltaX = 20;

   public LinearGradientTextView(Context context) {
       super(context);
   }

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

   }


   @Override
   protected void onSizeChanged(int w, int h, int oldw, int oldh) {
       super.onSizeChanged(w, h, oldw, oldh);

       paint = getPaint();
       //GradientSize=两个文字的大小
       String text = getText().toString();
       float textWidth = paint.measureText(text);
       int gradientSize = (int) (3 * textWidth / text.length());
       linearGradient = new LinearGradient(-gradientSize, 0, 0, 0,
               new int[]{0x22ffffff, 0xffffffff, 0x22ffffff},
               new float[]{0, 0.5f, 1}, TileMode.CLAMP);//边缘融合
       paint.setShader(linearGradient);
       matrix = new Matrix();
   }

   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
       float textWidth = getPaint().measureText(getText().toString());
       translateX += deltaX;
       if(translateX > textWidth + 1|| translateX < 1){
           deltaX = -deltaX;
       }
//      matrix.setScale(sx, sy)
       //动画平移
       matrix.setTranslate(translateX, 0);
       linearGradient.setLocalMatrix(matrix);

       postInvalidateDelayed(50);

   }
}
public class MyGradientView extends View {

    private Bitmap bitmap;

    private Paint paint;

    private BitmapShader bitmapShader;

    private int width;
    private int height;
    private int[] colors = {Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW};

    private RadialGradient radialGradient;

    private SweepGradient sweepGradient;

    //组合渲染
    private ComposeShader composeShader;

    public MyGradientView(Context context) {
        super(context);

        bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.fengjing)).getBitmap();

        paint = new Paint();

        width = bitmap.getWidth();
        height = bitmap.getHeight();
    }

    public MyGradientView(Context context,
            @Nullable AttributeSet attrs,
            Bitmap bitmap) {
        super(context, attrs);
        this.bitmap = bitmap;
    }

    public MyGradientView(Context context,
            @Nullable AttributeSet attrs, int defStyleAttr,
            Bitmap bitmap) {
        super(context, attrs, defStyleAttr);
        this.bitmap = bitmap;

    }

    /**
     *
     * @param canvas
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);
        //canvas.drawBitmap(bitmap, 0, 0, paint);
        /**
         * TileMode.CLAMP 拉伸最后一个像素去铺满剩下的地方
         * TileMode.MIRROR 通过镜像翻转铺满剩下的地方
         * TileMode.REPEAT 重复图片填充整个画面(电脑设置壁纸)
         */
        bitmapShader = new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT);
        //   bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
        paint.setShader(bitmapShader);
        paint.setAntiAlias(true);

        //canvas.drawRect(new Rect(0, 0, 800, 800), paint);

        //设置像素矩阵,来调整大小,为了解决宽高不一致的问题
//        float scale = Math.max(width, height) * 1.0f / Math.min(width, height);
//        Matrix matrix = new Matrix();
//        matrix.setScale(scale, scale);//缩放比例
//        bitmapShader.setLocalMatrix(matrix);

        //  canvas.drawRect(new Rect(0, 0, 800, 800), paint);
        //canvas.drawCircle(width/2,width/2, width/2,paint);

        //     canvas.drawCircle(Math.max(width, height) / 2f,
        //         scale * Math.max(width, height) / 2f, Math.max(width, height) / 2f, paint);

        //canvas.drawOval(new RectF(0, 0, width, height * 1.5f), paint);
        // canvas.drawOval(new RectF(0,0,width,width),paint);

        //通过shapeDrawable也可以实现
//        ShapeDrawable shapeDrawable =new ShapeDrawable(new OvalShape());
//        shapeDrawable.getPaint().setShader(bitmapShader);
//        shapeDrawable.setBounds(0,0,width,width);
//        shapeDrawable.draw(canvas);
        /**
         * 线性渐变
         * x0,y0 起始点
         * x1,y1 结束点
         * int[] colors 中间依次要出现的颜色
         * float[] positions 数组大小跟colors数组一样大,中间依次摆放的几个颜色分别放置在那个位置上(参考比例从左往右)
         * title
         *
         */
//        LinearGradient linearGradient = new LinearGradient(0, 0, 400, 400, colors, null,
//                TileMode.REPEAT);
//        paint.setShader(linearGradient);
//        canvas.drawRect(0,0,400,400,paint);

//        //环形渲染
//        radialGradient = new RadialGradient(300,300,100,colors,null,TileMode.REPEAT);
//        paint.setShader(radialGradient);
//        canvas.drawCircle(300,300,300,paint);

        //梯度渲染
//        sweepGradient = new SweepGradient(300, 300, colors, null);
//        paint.setShader(sweepGradient);
//        canvas.drawCircle(300, 300, 300, paint);

        //组合渲染
        LinearGradient linearGradient = new LinearGradient(0, 0, 400, 400, colors, null,
                TileMode.REPEAT);
        composeShader = new ComposeShader(linearGradient, bitmapShader, PorterDuff.Mode.SRC_OVER);
        paint.setShader(composeShader);
        canvas.drawRect(0, 0, 800, 1000, paint);
    }
}
public class ZoomImageView extends View {

    //放大倍数
    private static final int FACTOR = 3;
    private static final int RADIUS = 100;
    public Bitmap bitmap;
    private ShapeDrawable drawable;

    private Matrix matrix = new Matrix();

    public ZoomImageView(Context context) {
        super(context);
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.beauty);
        Bitmap bmp = bitmap;
        bmp = Bitmap
                .createScaledBitmap(bmp, bmp.getWidth() * FACTOR, bmp.getHeight() * FACTOR, true);

        //制作一个圆形的图片(放大的局部),盖在canvas上
        BitmapShader shader = new BitmapShader(bmp, TileMode.CLAMP, TileMode.CLAMP);
        drawable = new ShapeDrawable(new OvalShape());
        drawable.getPaint().setShader(shader);
        //切出矩形区域----用于绘制圆(内切圆)
        drawable.setBounds(0, 0, RADIUS * 2, RADIUS * 2);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(bitmap, 0, 0, null);
        //画制作好的圆形图片
        drawable.draw(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();

        matrix.setTranslate(RADIUS - x * FACTOR, RADIUS - y * FACTOR);
        drawable.getPaint().getShader().setLocalMatrix(matrix);
        drawable.setBounds(x - RADIUS, y - RADIUS, x + RADIUS, y + RADIUS);
        //手指按下才进行缩放
        postInvalidate();
        return super.onTouchEvent(event);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容