美文网首页
Android Canvas实现自定义形状的image

Android Canvas实现自定义形状的image

作者: 平凡小天地 | 来源:发表于2019-11-17 11:44 被阅读0次

    灵活自定义imageview的形状

    • 在自定义View的ondraw方法中实现绘制的内容,各个layer逐个绘制,通过设置PorterDuffXfermode实现不同的图片叠加效果
    //设置背景色
    
    canvas.drawARGB(255, 139, 197, 186);
    
    int canvasWidth = canvas.getWidth();
    
    int canvasHeight = canvas.getHeight();
    
    int layerId = canvas.saveLayer(0, 0, canvasWidth, canvasHeight, null, Canvas.ALL_SAVE_FLAG);
    
    int r = canvasWidth / 2;
    
    //根据图片生成bitmapshader
    
    paint.setColor(0xFFFFCC44);
    
    Bitmap bitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.xihu));
    
    bitmap = scaleBitmap(bitmap,2*r,2*r);
    
    BitmapShader bitmapShader = new BitmapShader(bitmap,Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
    
    paint.setShader(bitmapShader);
    
    canvas.drawCircle(r, r, r, paint);
    
    //使用CLEAR作为PorterDuffXfermode绘制蓝色的矩形
    
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));// clear 到背景颜色那一层
    
    canvas.drawCircle(r*3f-50, r, r , paint);
    
    //最后将画笔去除Xfermode
    
    paint.setXfermode(null);
    
    canvas.restoreToCount(layerId);
    
    • Bitmap生成shader的时候,需要将图片缩放成view的大小
    /**
    
     * 根据给定的宽和高进行拉伸
    
    * @param origin    原图
    
    * @param newWidth  新图的宽
    
    * @param newHeight 新图的高
    
    * @return new Bitmap
    
     */
    
    private Bitmap scaleBitmap(Bitmap origin, int newWidth, int newHeight) {
    
        if (origin == null) {
    
            return null;
    
        }
    
        int height = origin.getHeight();
    
        int width = origin.getWidth();
    
        float scaleWidth = ((float) newWidth) / width;
    
        float scaleHeight = ((float) newHeight) / height;
    
        Matrix matrix = new Matrix();
    
        matrix.postScale(scaleWidth, scaleHeight);// 使用后乘
    
        Bitmap newBM = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, false);
    
        if (!origin.isRecycled()) {
    
            origin.recycle();
    
        }
    
        return newBM;
    
    }
    
    • 效果
    r1McLAqQYLVfWL6Ducp97ZuhdH1OWBRhZiWv2OEBSZYGCWP7ps.png
    • 业务中是通过设计师给出的svgx图片生成path,根据path绘制出想要的图形,再用需要展示的bitmap缩放后生成着色器,再实现渲染;因为svg形状可以任意,因此更加灵活

    Android graphics使用

    (1)绘制形状Canvas

    [图片上传失败...(image-3c6580-1573961626362)]

    Path可自由实现各种自定义形状:直线,圆弧,贝塞尔曲线等等

    Path path = new Path();

    RectF rect = new RectF(300,300,1000,800);

    mPaint.setColor(Color.GRAY);

    mPaint.setStyle(Style.FILL);

    canvas.drawRect(rect, mPaint);

    mPaint.setColor(Color.BLACK);

    mPaint.setStyle(Style.STROKE);

    path.lineTo(100, 100); //用path画一条从(0,0)到(100,100)的直线

    path.arcTo(rect, 90, 180); //用arcTo方法画一段圆弧

    canvas.drawPath(path, mPaint); //直线终点(100,100)与圆弧起点会连成一条直线

    (2)绘制效果Paint

    • Paint

    • 设置颜色

    • 设置笔触效果/文字大小

    • 设置滤镜

    • 设置透明度

    • 设置着色器Shader

    • BimapShader:位图的图像渲染器

    • LinearGradient:线性渲染器

    • RadialGradient:环形渲染器,一般的水波纹效果,充电水波纹扩散效果、调色板都可以使用该渲染器实现。

    • SweepGradient:梯度渲染器(即扫描渲染),可以使用该渲染器实现,如:微信等雷达扫描效果、手机卫士垃圾扫描。

    • ComposeShader:组合渲染器

    • 设置layer之间的组合模式PorterDuffXfermode等等

    [图片上传失败...(image-f699f4-1573961626362)]

    (3)绘制位置坐标

    [图片上传失败...(image-f432a2-1573961626362)]

    (4)变换处理Matrix

    • setTranslate(float dx,float dy):控制Matrix进行位移

    • setSkew(float kx,float ky):控制Matrix进行倾斜,kx、ky为X、Y方向上的比例

    • setSkew(float kx,float ky,float px,float py):控制Matrix以px、py为轴心进行倾斜,kx、ky为X、Y方向上的倾斜比例

    • setRotate(float degrees):控制Matrix进行depress角度的旋转,轴心为(0,0)

    • setRotate(float degrees,float px,float py):控制Matrix进行depress角度的旋转,轴心为(px,py)

    • setScale(float sx,float sy):设置Matrix进行缩放,sx、sy为X、Y方向上的缩放比例

    • setScale(float sx,float sy,float px,float py):设置Matrix以(px,py)为轴心进行缩放,sx、sy为X、Y方向上的缩放比例

    例:将bitmap放大2倍

    Matrix matrix = new Matrix();

    matrix.postScale(2, 2);// 使用后乘

    Bitmap newBM = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, false);

    (5)自定义动画效果

    [图片上传失败...(image-47702a-1573961626362)]

    [图片上传失败...(image-b5fd46-1573961626362)]

    参考文档

    graphic基本操作例子

    相关文章

      网友评论

          本文标题:Android Canvas实现自定义形状的image

          本文链接:https://www.haomeiwen.com/subject/nprpictx.html