Android canvas & shader & path

通过一个View汇总canvas, shader, path的用法


============

查看效果时, 直接把MyView放在布局文件就好:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.crazy.lin.PathTest.PathActivity1">
    
    <com.crazy.lin.PathTest.PathView1
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>


=============

MyView.java:

public class PathView1 extends View {
    private int COL_GAP=12;
    private int ROW_GAP=15;
    private int TEXT_HEIGHT=25;
    private int itemWidth;
    private DrawItem[] drawItems=new DrawItem[7];
    public PathView1(Context context, AttributeSet attrs) {
        super(context, attrs);
        COL_GAP=Utils.dp2px(context,COL_GAP);
        ROW_GAP=Utils.dp2px(context,ROW_GAP);
        TEXT_HEIGHT=Utils.dp2px(context,TEXT_HEIGHT);
        drawItems[0]=new CircleDrawItem();
        drawItems[1]=new RectDrawItem();
        drawItems[2]=new RectDrawItem2();
        drawItems[3]=new RoundRectDrawItem();
        drawItems[4]=new OvalDrawItem();
        drawItems[5]=new TriangleDrawItem();
        drawItems[6]=new StarDrawItem();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int curY=ROW_GAP;
        for (int i=0;i<7;i++){
            int drawHeight=drawItems[i].draw(curY,canvas);
            curY+=ROW_GAP+drawHeight+TEXT_HEIGHT;
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width=MeasureSpec.getSize(widthMeasureSpec);
        itemWidth=(width-COL_GAP*4)/3;
        int height=ROW_GAP*8+itemWidth*7+TEXT_HEIGHT*7-itemWidth*2/3;
        setMeasuredDimension(width, height);
    }
    interface DrawItem{
        public static final Paint paint=new Paint();
        public static final Shader shader=new LinearGradient(0,0,100,100, Color.GREEN,Color.BLUE, Shader.TileMode.MIRROR);
        public static final int TEXTSIZE=25;
        public int draw(int curY, Canvas canvas);
    }
    class CircleDrawItem implements DrawItem{
        @Override
        public int draw(int curY, Canvas canvas) {
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.STROKE);
            int curX=COL_GAP;
            curY=ROW_GAP;
            //
            paint.setTextSize(TEXTSIZE);
            canvas.drawText("drawOval",curX,curY,paint);
            curY+=TEXT_HEIGHT-ROW_GAP;
            RectF rectF=new RectF(curX,curY, curX+itemWidth, itemWidth+curY);
            //
            canvas.drawOval(rectF, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            paint.setStyle(Paint.Style.FILL);
            rectF.set(curX, curY, curX + itemWidth, itemWidth + curY);
            canvas.drawOval(rectF, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            paint.setStyle(Paint.Style.FILL);
            paint.setShader(shader);
            rectF.set(curX, curY, curX + itemWidth, itemWidth + curY);
            canvas.drawOval(rectF, paint);
            paint.setShader(null);
            return itemWidth;
        }
    }
    class RectDrawItem implements DrawItem{
        @Override
        public int draw(int curY, Canvas canvas) {
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.STROKE);
            int curX=COL_GAP;
            curY+=ROW_GAP;
            //
            paint.setTextSize(TEXTSIZE);
            canvas.drawText("drawRect",curX,curY,paint);
            curY+=TEXT_HEIGHT-ROW_GAP;
            RectF rectF=new RectF(curX,curY, curX+itemWidth, itemWidth+curY);
            //
            canvas.drawRect(rectF, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            paint.setStyle(Paint.Style.FILL);
            rectF.set(curX, curY, curX + itemWidth, itemWidth + curY);
            canvas.drawRect(rectF, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            paint.setStyle(Paint.Style.FILL);
            paint.setShader(shader);
            rectF.set(curX, curY, curX + itemWidth, itemWidth + curY);
            canvas.drawRect(rectF, paint);
            paint.setShader(null);
            return itemWidth;
        }
    }
    class RectDrawItem2 implements DrawItem{
        @Override
        public int draw(int curY, Canvas canvas) {
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.STROKE);
            int curX=COL_GAP;
            curY+=ROW_GAP;
            //
            paint.setTextSize(TEXTSIZE);
            canvas.drawText("drawRect",curX,curY,paint);
            curY+=TEXT_HEIGHT-ROW_GAP;
            RectF rectF=new RectF(curX,curY, curX+itemWidth, itemWidth*4/6+curY);
            //
            canvas.drawRect(rectF, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            paint.setStyle(Paint.Style.FILL);
            rectF.set(curX, curY, curX+itemWidth, itemWidth*4/6+curY);
            canvas.drawRect(rectF, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            paint.setStyle(Paint.Style.FILL);
            paint.setShader(shader);
            rectF.set(curX, curY, curX + itemWidth, itemWidth * 4 / 6 + curY);
            canvas.drawRect(rectF, paint);
            paint.setShader(null);
            return itemWidth*4/6;
        }
    }
    class RoundRectDrawItem implements DrawItem{
        int RADIUS=52;
        @Override
        public int draw(int curY, Canvas canvas) {
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.STROKE);
            int curX=COL_GAP;
            curY+=ROW_GAP;
            //
            paint.setTextSize(TEXTSIZE);
            canvas.drawText("drawRoundRect",curX,curY,paint);
            curY+=TEXT_HEIGHT-ROW_GAP;
            RectF rectF=new RectF(curX,curY, curX+itemWidth, itemWidth+curY);
            //
            canvas.drawRoundRect(rectF, RADIUS, RADIUS, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            paint.setStyle(Paint.Style.FILL);
            rectF.set(curX, curY, curX+itemWidth, itemWidth+curY);
            canvas.drawRoundRect(rectF,RADIUS,RADIUS, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            paint.setStyle(Paint.Style.FILL);
            paint.setShader(shader);
            rectF.set(curX, curY, curX + itemWidth, itemWidth + curY);
            canvas.drawRoundRect(rectF, RADIUS, RADIUS, paint);
            paint.setShader(null);
            return itemWidth;
        }
    }
    class OvalDrawItem implements DrawItem{
        @Override
        public int draw(int curY, Canvas canvas) {
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.STROKE);
            int curX=COL_GAP;
            curY+=ROW_GAP;
            //
            paint.setTextSize(TEXTSIZE);
            canvas.drawText("drawOval",curX,curY,paint);
            curY+=TEXT_HEIGHT-ROW_GAP;
            RectF rectF=new RectF(curX,curY, curX+itemWidth, itemWidth*4/6+curY);
            //
            canvas.drawOval(rectF, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            paint.setStyle(Paint.Style.FILL);
            rectF.set(curX, curY, curX + itemWidth, itemWidth*4/6 + curY);
            canvas.drawOval(rectF, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            paint.setStyle(Paint.Style.FILL);
            paint.setShader(shader);
            rectF.set(curX, curY, curX + itemWidth, itemWidth * 4 / 6 + curY);
            canvas.drawOval(rectF, paint);
            paint.setShader(null);
            return itemWidth*4/6;
        }
    }
    class TriangleDrawItem implements DrawItem{
        @Override
        public int draw(int curY, Canvas canvas) {
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.STROKE);
            int curX=COL_GAP;
            curY+=ROW_GAP;
            //
            paint.setTextSize(TEXTSIZE);
            canvas.drawText("drawTriangle", curX, curY, paint);
            curY+=TEXT_HEIGHT-ROW_GAP;
            RectF rectF=new RectF(curX,curY, curX+itemWidth, itemWidth+curY);
            //
            Path path=new Path();
            path.moveTo(curX + itemWidth / 2, curY);
            path.lineTo(curX, curY + itemWidth);
            path.lineTo(curX + itemWidth, curY + itemWidth);
            path.close();
            canvas.drawPath(path, paint);
            //
            paint.setStyle(Paint.Style.FILL);
            curX=curX+itemWidth+COL_GAP;
            path=new Path();
            path.moveTo(curX + itemWidth / 2, curY);
            path.lineTo(curX, curY + itemWidth);
            path.lineTo(curX + itemWidth, curY + itemWidth);
            path.close();
            canvas.drawPath(path, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            path=new Path();
            path.moveTo(curX + itemWidth / 2, curY);
            path.lineTo(curX, curY + itemWidth);
            path.lineTo(curX + itemWidth, curY + itemWidth);
            path.close();
            paint.setShader(shader);
            canvas.drawPath(path, paint);
            paint.setShader(null);
            return itemWidth;
        }
    }
    class StarDrawItem implements DrawItem{
        @Override
        public int draw(int curY, Canvas canvas) {
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.STROKE);
            int curX=COL_GAP;
            curY+=ROW_GAP;
            //
            paint.setTextSize(TEXTSIZE);
            canvas.drawText("drawStar", curX, curY, paint);
            curY+=TEXT_HEIGHT-ROW_GAP;
            RectF rectF=new RectF(curX,curY, curX+itemWidth, itemWidth+curY);
            //
            Path path=new Path();
            path.moveTo(curX + itemWidth / 2, curY);
            path.lineTo(curX, curY + itemWidth * 5 / 10);
            path.lineTo(curX + itemWidth * 1 / 6, curY + itemWidth);
            path.lineTo(curX+ itemWidth*5/6 , curY + itemWidth);
            path.lineTo(curX + itemWidth, curY + itemWidth * 5 / 10);
            path.close();
            canvas.drawPath(path, paint);
            //
            paint.setStyle(Paint.Style.FILL);
            curX=curX+itemWidth+COL_GAP;
            path=new Path();
            path.moveTo(curX + itemWidth / 2, curY);
            path.lineTo(curX, curY + itemWidth * 5 /10 );
            path.lineTo(curX + itemWidth * 1 / 6, curY + itemWidth);
            path.lineTo(curX+ itemWidth*5/6 , curY + itemWidth);
            path.lineTo(curX+itemWidth, curY + itemWidth*5/10);
            path.close();
            canvas.drawPath(path, paint);
            //
            curX=curX+itemWidth+COL_GAP;
            path=new Path();
            path.moveTo(curX + itemWidth / 2, curY);
            path.lineTo(curX, curY + itemWidth * 5 /10 );
            path.lineTo(curX + itemWidth * 1 / 6, curY + itemWidth);
            path.lineTo(curX+ itemWidth*5/6 , curY + itemWidth);
            path.lineTo(curX+itemWidth, curY + itemWidth*5/10);
            path.close();
            paint.setShader(shader);
            canvas.drawPath(path, paint);
            paint.setShader(null);
            return itemWidth;
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值