通过一个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;
}
}
}