canvas的cliprect以及drawTextOnPath,Region.OP

  最近在看些关于ui方面的知识,可能有些人觉得ui很简单,没什么值得学的,但是,就我的愚见,个人觉得ui挺重要的,比方说,一个应用就算功能很完善,很牛逼,但是初始化的界面却是很渣,我想大家应该不会喜欢用它,在另一个方面。好的ui也可以帮助我们合理的安排功能,比如一个listview,一个gridview,就有不同的视觉体验,让人感觉gridview是天生的“书架”,而listview是天生的“菜单”,好吧,跑远了,在跑远一点,想起当初学java时,张婵老师问一个同学,问他觉得自己Android学的怎样,然后他说ui学得不错,然后老师跟他说ui是最简单的,现在想想,真的想要反驳一下,好了,回正题,大家肯定都知道360,或者用过,再扯一下,大家都喷360,那么想想。你喷的理由有哪些是自己总结,亲身体验的,而不是道听途说的,说道360.反正我想起的是哪个波浪球,不过今天这博客不是写波浪球。而是他应用到的一个方法------clipcircle这个方法
不过再次抱歉,今天不是写这个。。。今天主要是对clipxxxx这些方法做个简单的介绍,原理就是对canvas进行截取,相当于截一部分的屏,然后让其他的部位不现实,360的滚动球就是这原理,上代码吧,免得越扯越远。。。。

在下面的代码中,穿插了一下关于drawTextOnPath这个方法的使用,对于这个method有兴趣的,记得查找api。。。或者博客




//Path主要用于绘制复杂的图形轮廓,比如折线,圆弧以及各种复杂图案
// cliprect 只有在这个区域内的才显示,其他所有内容好像被裁剪掉了一样,不显示。
//Android graphics。path的使用方法
//(weizhengli )
//1. Path--->quadTo(float x1, float y1, float x2, float y2):
//    该方法的实现是当我们不仅仅是画一条线甚至是画弧线时会形成平滑的曲线,
//该曲线又称为"贝塞尔曲线"(Bezier curve),其中,x1,y1为控制点的坐标值,
//x2,y2为终点的坐标值;
//2. Path--->lineTo(float x, float y) :
//    该方法实现的仅仅是两点连成一线的绘制线路

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;

public class Myview extends View {
    private Path path;
    private Paint paint;
    private Path[] paths = new Path[3];
    Paint paint2;

    public Myview(Context context, AttributeSet attrs) {
        super(context, attrs);
        setFocusable(true);
        paint2 = new Paint();
        paint2.setColor(Color.WHITE);
        paint2.setTextSize(30);

        paths[0] = new Path();
        paths[0].moveTo(0, 0);
        for (int i = 0; i < 15; i++) {// 一条线的路径
            paths[0].lineTo(i * 30, (float) Math.random() * 60);
        }
        paths[1] = new Path();
        RectF oval = new RectF(0, 0, 300, 200);// 指明一个矩形,为下面的椭圆指明范围,java类
        paths[1].addOval(oval, Path.Direction.CCW);// 一个椭圆的路径
        paths[2] = new Path();
        paths[2].addArc(oval, 60, 180);// 一个弧线的路径

        paint = new Paint();
        paint.setColor(Color.GREEN);

        paint.setAntiAlias(true);
        paint.setStyle(Style.STROKE);
        paint.setTextAlign(Align.RIGHT);
        paint.setTextSize(60);
        path = new Path();

    }

    private void drawScene(Canvas canvas) {
        canvas.clipRect(0, 0, 100, 100);
        canvas.drawColor(Color.WHITE);
        paint.setColor(Color.RED);
        canvas.drawLine(0, 0, 100, 100, paint);

        paint.setColor(Color.GREEN);
        canvas.drawCircle(30, 70, 30, paint);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.GRAY);
        canvas.save();
        canvas.translate(10, 10);
        drawScene(canvas);
        canvas.restore();

        canvas.save();
        canvas.translate(160, 10);
        canvas.clipRect(10, 10, 90, 90);
        canvas.clipRect(30, 30, 70, 70, Region.Op.DIFFERENCE); // 差数
        drawScene(canvas);
        canvas.restore();

        canvas.save();
        canvas.translate(10, 160);
        path.reset();
        canvas.clipPath(path);
        path.addCircle(50, 50, 50, Path.Direction.CCW);
        canvas.clipPath(path, Region.Op.REPLACE);
        drawScene(canvas);
        canvas.restore();

        canvas.save();
        canvas.translate(160, 160);
        canvas.clipRect(0, 0, 60, 60);
        canvas.clipRect(40, 40, 100, 100, Region.Op.UNION); //
        drawScene(canvas);
        canvas.restore();

        canvas.save();
        canvas.translate(10, 310);
        canvas.clipRect(0, 0, 60, 60);
        canvas.clipRect(40, 40, 100, 100, Region.Op.XOR);
        drawScene(canvas);
        canvas.restore();

        canvas.save();
        canvas.translate(160, 310);
        canvas.clipRect(0, 0, 60, 60);
        canvas.clipRect(40, 40, 100, 100, Region.Op.REVERSE_DIFFERENCE);
        drawScene(canvas);
        canvas.restore();

        canvas.save();
        canvas.translate(160, 480);

        canvas.drawTextOnPath("sssssssssssssssssssssssssssssssss", paths[0], 0, 0, paint);
        canvas.restore();
    }
    // INTERSECT 取两者交集,默认的方式
    // DIFFERENCE 第一次不同于第二次的部分显示出来
    // REPLACE 显示第二次的
    // REVERSE_DIFFERENCE 第二次不同于第一次的部分显示
    // UNION 取全集
    // XOR 补集,就是全集的减去交集的剩余部分显示
    // Path.Direction.CCW
    // 逆时针
    // Path.Direction.CW
    // 顺时针

}
(部分代码是从其他博客上截取的)。。。别介意那首歌。。。



最后,补充一下关于path的使用,在代码中关于path【0】中,可以看出来,首先是path一个,然后是开始加点的坐标,接着是画图,然后就没了


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值