【android】自定义控件基础第二篇

一.RectF与Rect

1.是否包含某个点

boolean contains(float x, float y)

根据这个可以写一个例子:
绘制一个矩形,判断手指是否在范围内。

public class BasisView extends View {

    private int mX, mY;
    private RectF rectF;
    private Paint mPaint;

    public BasisView(Context context) {
        super(context);
        init();
    }

    public BasisView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BasisView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }


    private void init() {
        //初始化画笔
        mPaint=new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(5);
        //初始化区域
        rectF = new RectF();
        rectF.set(100, 10, 1000, 300);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mX = (int) event.getX();
        mY = (int) event.getY();
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            invalidate();
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            mX = -1;
            mY = -1;
        }
        postInvalidate();
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (rectF.contains(mX, mY)) {
            mPaint.setColor(Color.GREEN);
        } else {
            mPaint.setColor(Color.RED);
        }
        canvas.drawRect(rectF, mPaint);
    }
}

contain方法还有两个不同的参数

boolean contains(RectF r)
boolean contains(float left, float top, float right, float bottom)

2.判断两个矩形是否相交

boolean intersect(RectF a, RectF b)

静态方法判断是否相交

RectF.intersects(a,b);

成员方法判断是否相交

a= new RectF();
a.set(100, 10, 1000, 300);
a.intersect(b);

成员方法不仅会返回相交结果而且会把相交的部分赋值给当前对象。不相交则不赋值。

3.合并两个矩形

合并的意思是无论两个矩形是否相交,两个矩形最小左上角为新矩形的左上角,两个矩形最大右下角为新矩形的右下角,

 void union(RectF r)

二.路径

1.绘制方法

void drawPath(Path path, Paint paint)

2.直线路径

画一条直线路径需要三个步骤

void moveTo(float x, float y)
void lineTo(float x, float y)
 void close()

举例:
画一个三角形

 Paint paint = new Paint();
 paint.setColor(Color.RED);
 paint.setStyle(Paint.Style.STROKE);
 paint.setStrokeWidth(5);

 Path path = new Path();
 path.moveTo(10,10);
 path.lineTo(10,100);
 path.lineTo(300,100);
 path.close();
 
 canvas.drawPath(path,paint);

3.弧线路径

void arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)
  • oval:生成椭圆的矩形
  • startAngle:开始角度
  • sweepAngle:持续角度
  • forceMoveTo:是否强制将弧的起点作为绘制起点

4.addXXX系列

路径一般是连贯的,而带有add的参数可以直接在Path中添加,不必考虑连贯性。

添加弧

void addArc(RectF oval, float startAngle, float sweepAngle)

添加矩形

void addRect(RectF rect, Path.Direction dir)

dir参数:

  • Path.Direction.CCW:逆时针
  • Path.Direction.CW:顺时针

添加圆角矩形

void addRoundRect(RectF rect, float rx, float ry, Path.Direction dir)

添加圆形路径

void addCircle(float x, float y, float radius, Path.Direction dir)

添加椭圆路径

void addOval(RectF oval, Path.Direction dir)

5.路径填充模式

  • Path.FillType.WINDING:默认值,当两个图形相交时,取相交部分显示。
  • Path.FillType.EVEN_ODD:取path所在并不相交的区域。
  • Path.FillType.INVERSE_WINDING:取path的外部区域。
  • Path.FillType.INVERSE_EVEN_ODD:取path的外部与相交区域。

6.重置

当我们需要绘制一条新的路径时,我们可以重置路径,达到复用的目的。

提供了两个方法

void reset() 
void rewind()

rewind会清除FillType和路径数据,但会保持数据结构。这样可以实现快速复用。
reset会清除路径数据和结构,但不会清除FillType。

三.文字

文字需要用画笔实现

文字对齐方式

 void setTextAlign(Paint.Align align)

文字大小

void setTextSize(float textSize)

是否加粗

void setFakeBoldText(boolean fakeBoldText)

下划线

 void setUnderlineText(boolean underlineText)

倾斜

void setTextSkewX(float skewX)

删除线

void setStrikeThruText(boolean strikeThruText)

水平拉伸

void setTextScaleX(float scaleX)

绘制

void drawText(String text, float x, float y, Paint paint)

沿路径绘制

void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)
  • hOffset:沿路径起始点的水平偏移量
  • vOffset:与路径中心的垂直偏移量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值