Android自定义View面试题自定义控件

Paint画笔Canvas画布汇总1

2019-08-14  本文已影响0人  Small_Cake

1.画笔 Paint

2.画布 Canvas

用画布画各种几何图形https://blog.csdn.net/harvic880925/article/details/38875149

//RectF
RectF()
RectF(float left, float top, float right, float bottom)
RectF(RectF r)
RectF(Rect r)
//Rect
Rect()
Rect(int left, int top, int right, int bottom)
Rect(Rect r)

3.路径Path

用画布画路径及文字https://blog.csdn.net/harvic880925/article/details/38926877

1.直线路径
2.矩形路径
3.圆角矩形路径
4.圆形路径

void addCircle (float x, float y, float radius, Path.Direction dir)
x:圆心X轴坐标
y:圆心Y轴坐标
radius:圆半径

5.椭圆路径

void addOval (RectF oval, Path.Direction dir)

6.弧形路径
7.线段轨迹

4.文字 Paint+Path+Canvas

画笔Paint的设置

1.普通设置

paint.setStrokeWidth (5);//设置画笔宽度
paint.setAntiAlias(true); //指定是否使用抗锯齿功能,如果使用,会使绘图速度变慢
paint.setStyle(Paint.Style.FILL);//绘图样式,对于设文字和几何图形都有效
paint.setTextAlign(Align.CENTER);//设置文字对齐方式,取值:align.CENTERalign.LEFTalign.RIGHT
paint.setTextSize(12);//设置文字大小

2.样式设置

paint.setFakeBoldText(true);//粗体
paint.setUnderlineText(true);//下划线
paint.setTextSkewX((float) -0.25);//字体水平倾斜度,普通斜体字是-0.25
paint.setStrikeThruText(true);//删除线
paint.setTextScaleX(2);//只会将水平方向拉伸,高度不会变
paint.setStrokeCap(Paint.Cap.BUTT)//划过的线条和路径

画布Canvas的绘图方式

1.普通水平绘制

void drawText (String text, float x, float y, Paint paint)//常规绘制
void drawText (String text, int start, int end, float x, float y, Paint paint)//截取文字绘制
void drawText (char[] text, int index, int count, float x, float y, Paint paint)//截取数组文字绘制
void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)//多媒体文字绘制,但这里的text并不支持复杂的多媒体文字绘制,只是支持这种类型而已,所以Span创建的特效是没有用的。

2.指定单个文字位置绘制,由于不支持glyph的合成【已过时】
3.沿路径绘制

void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)
void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)
hOffset 与路径起始点的高度偏移距离,为负会导致起始文字重叠
vOffset 与路径中心的垂直偏移量

字体样式Typeface在Paint中设置字体样式:paint.setTypeface(typeface);

1.创建Typeface

5.区域 Range

参考:https://blog.csdn.net/harvic880925/article/details/39056701

1、基本构造函数

public Region() //创建一个空的区域 ,需要配合其它函数使用
public Region(Region region) //复制一个region的区域
public Region(Rect r) //创建一个矩形的区域 ,通过矩形
public Region(int left, int top, int right, int bottom) //创建一个矩形的区域,通过左上右下

2、矩形集枚举区域——RegionIterator类

由于在Canvas中没有直接绘制Region的函数,我们想要绘制一个区域,就只能通过利用RegionIterator构造矩形集来逼近的显示区域。用法如下

    private void drawRegion(Canvas canvas, Region region, Paint paint) {
        RegionIterator iter = new RegionIterator(region);
        Rect rect = new Rect();
        while (iter.next(rect)) canvas.drawRect(rect, paint);
        //或者其他可以用Rect来绘制的方法:
       //while (iter.next(rect)) canvas.drawOval(new RectF(rect), paint);
    }
drawRect和drawOval
3、区域的合并、交叉等操作

public final boolean union(Rect r)
public boolean op(Rect r, Op op)
public boolean op(int left, int top, int right, int bottom, Op op)
public boolean op(Region region, Op op)
public boolean op(Rect rect, Region region, Op op)

例如两个矩形取交集:

        //初始化画笔
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(2);
        //构造两个矩形
        Rect rect1 = new Rect(100,100,400,200);
        Rect rect2 = new Rect(200,0,300,300);
        //构造两个Region
        Region region = new Region(rect1);
        Region region2= new Region(rect2);
        //取两个区域的交集
        region.op(region2, Region.Op.INTERSECT);
        //绘制两个空的矩形
        canvas.drawRect(rect1, paint);
        canvas.drawRect(rect2, paint);
        //交集用绿色绘制
        Paint paint_fill = new Paint();
        paint_fill.setColor(Color.MAGENTA);
        paint_fill.setStyle(Paint.Style.FILL);
        drawRegion(canvas, region, paint_fill);
两个矩形取交集
drawRect全部参数展示
drawOval全部参数展示
4、其它一些方法
/**几个判断方法*/  
public native boolean isEmpty();//判断该区域是否为空  
public native boolean isRect(); //是否是一个矩阵  
public native boolean isComplex();//是否是多个矩阵组合  
  
  
/**一系列的getBound方法,返回一个Region的边界*/  
public Rect getBounds()   
public boolean getBounds(Rect r)   
public Path getBoundaryPath()   
public boolean getBoundaryPath(Path path)   
  
  
/**一系列的判断是否包含某点 和是否相交*/  
public native boolean contains(int x, int y);//是否包含某点  
public boolean quickContains(Rect r)   //是否包含某矩形
public native boolean quickContains(int left, int top, int right,  
                                        int bottom) //是否没有包含某矩阵形 
 public boolean quickReject(Rect r) //是否没和该矩形相交  
 public native boolean quickReject(int left, int top, int right, int bottom); //是否没和该矩形相交  
 public native boolean quickReject(Region rgn);  //是否没和该矩形相交  
  
/**几个平移变换的方法*/  
public void translate(int dx, int dy)   
public native void translate(int dx, int dy, Region dst);  
public void scale(float scale) //hide  
public native void scale(float scale, Region dst);//hide  /**几个判断方法*/  
public native boolean isEmpty();//判断该区域是否为空  
public native boolean isRect(); //是否是一个矩阵  
public native boolean isComplex();//是否是多个矩阵组合  
  
  
/**一系列的getBound方法,返回一个Region的边界*/  
public Rect getBounds()   
public boolean getBounds(Rect r)   
public Path getBoundaryPath()   
public boolean getBoundaryPath(Path path)   
  
  
/**一系列的判断是否包含某点 和是否相交*/  
public native boolean contains(int x, int y);//是否包含某点  
public boolean quickContains(Rect r)   //是否包含某矩形
public native boolean quickContains(int left, int top, int right,  
                                        int bottom) //是否没有包含某矩阵形 
 public boolean quickReject(Rect r) //是否没和该矩形相交  
 public native boolean quickReject(int left, int top, int right, int bottom); //是否没和该矩形相交  
 public native boolean quickReject(Region rgn);  //是否没和该矩形相交  
  
/**几个平移变换的方法*/  
public void translate(int dx, int dy)   
public native void translate(int dx, int dy, Region dst);  
public void scale(float scale) //hide  
public native void scale(float scale, Region dst);//hide  
上一篇下一篇

猜你喜欢

热点阅读