自定义图片形状

来源:互联网 发布:中国人民大学数据库 编辑:程序博客网 时间:2024/05/02 04:26

自定义图片形状(通过ShapeDrawable):

import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Path;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.ShapeDrawable;import android.graphics.drawable.shapes.ArcShape;import android.graphics.drawable.shapes.OvalShape;import android.graphics.drawable.shapes.PathShape;import android.graphics.drawable.shapes.RectShape;import android.graphics.drawable.shapes.RoundRectShape;import android.util.AttributeSet;import android.view.View;public class ShapeView extends View{    private Paint paint;    private BitmapShader bitmapShader;    private Bitmap bitmap;    private ShapeDrawable shapeDrawable;    private int centerx,centery,radius;    /** 默认类型为圆形*/    private int type=CIRCLE_BITMAP;    private Path path;    /** 外矩形 圆角半径 */    private float[] outerR;    /** 内部矩形与外部矩形的距离 */    private RectF inset;    /** 内矩形 圆角半径 */    private float[] innerRadii = {20, 20, 20, 20, 20, 20, 20, 20};    /** 圆形图片*/    public static final int CIRCLE_BITMAP=11;    /** 矩形图片*/    public static final int RECT_BITMAP=12;    /** 椭圆图片*/    public static final int OVAL_BITMAP=13;    /** 圆角图片*/    public static final int ROUNDRECT_BITMAP=14;    /** 弧形图片*/    public static final int ARC_BITMAP=15;    /** path路径图片*/    public static final int PATH_BITMAP=16;    public ShapeView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    public ShapeView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public ShapeView(Context context) {        super(context);    }    /**     * 设置图片类型     * @param type     */    public void SetType(int type){        this.type=type;    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        centerx=w/2;        centery=h/2;        radius=Math.min(centerx,centery);        paint=new Paint();        bitmap=((BitmapDrawable)getResources().getDrawable(R.drawable.shape)).getBitmap();        // 构造渲染器BitmapShader          bitmapShader=new android.graphics.BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);    }    @SuppressLint("DrawAllocation")    @Override    protected void onDraw(Canvas canvas) {        switch (type) {        case CIRCLE_BITMAP://          paint.setShader(bitmapShader);//          canvas.drawCircle(centerx,centery, radius, paint);            shapeDrawable=new ShapeDrawable(new OvalShape());//添加椭圆模型            shapeDrawable.setBounds(0, 0, radius*2, radius*2);//设置显示区域 为圆形            break;        case RECT_BITMAP:            shapeDrawable=new ShapeDrawable(new RectShape());//添加矩形模型            shapeDrawable.setBounds(0, 0, radius*2, radius*2);//设置显示区域 为圆形            break;        case OVAL_BITMAP:            shapeDrawable=new ShapeDrawable(new OvalShape());//添加椭圆模型            shapeDrawable.setBounds(0, 0, centerx*2, centery*2);//设置显示区域 为矩形            break;        case ROUNDRECT_BITMAP:            //外矩形 左上、右上、右下、左下 圆角半径             outerR = new float[] { 50, 50, 50, 50, 50, 50, 50, 50};            //内矩形距外矩形,左上角x,y距离, 右下角x,y距离  , 内部矩形与外部矩形的距离             inset = new RectF(150,150, 200,200);             shapeDrawable=new ShapeDrawable(new RoundRectShape(outerR,null, null));//添加圆角模型//          shapeDrawable=new ShapeDrawable(new RoundRectShape(outerR,inset, innerRadii));//添加圆角模型            shapeDrawable.setBounds(0, 0, centerx*2, centery*2);//设置显示区域 为矩形            break;        case ARC_BITMAP:            shapeDrawable=new ShapeDrawable(new ArcShape(135, 270));//添加弧形模型 (135:开始角度,270:扫描角度)            shapeDrawable.setBounds(0, 0, radius*2, radius*2);//设置显示区域 为圆形            break;        case PATH_BITMAP:            //绘制一个顶点为下列四个点的棱形              path = new Path();              path.moveTo(50, 0);              path.lineTo(0, 50);              path.lineTo(50, 100);              path.lineTo(100, 50);             shapeDrawable=new ShapeDrawable(new PathShape(path, 100, 200));//添加几何路径 // 100, 200 最终呈现出的坐标值(实际内部是缩放的canvas)            shapeDrawable.setBounds(0, 0, radius*2, radius*2);//设置显示区域 为圆形            break;        default:            break;        }        //得到画笔并设置渲染器            shapeDrawable.getPaint().setShader(bitmapShader);        //绘制shapeDrawable          shapeDrawable.draw(canvas);    }}

关于shape:

有位盆友写的挺详细,有兴趣的可以看看:http://blog.csdn.net/jjwwmlp456/article/details/46928859

0 0
原创粉丝点击