Android 图形:绘制渐变色奥运五环图形,游戏文字,验证码,Matrix旋转,缩放,倾斜,平移等

            case 5:     //绘制彩色字符串
                drawColorfulString(paint, canvas);
                break;
            case 6:     //绘制一个随机数字组成的验证码
                drawRadomNumberVerify(paint, canvas);
                break;
            case 7:     //使用 Matrix 旋转 图像
                drawRotate(paint, canvas);
                break;
            case 8:     //使用 Matrix 缩放 图像
                drawScale(paint, canvas);
                break;
            case 9:     //使用 Matrix 倾斜 图像
                drawSkew(paint, canvas);
                break;
            case 10:     //使用 Matrix 旋转后平移 图像
                drawRotateTranslate(paint,canvas);
                break;
        }
        super.onDraw(canvas);
    }
}
/**
 * 0.绘制以渐变色填充的矩形
 */
public void drawJianBianJuXing(Paint paint,Canvas canvas) {
    //线性渐变
    Shader shader=new LinearGradient(0, 0, 50, 50, Color.RED, Color.GREEN, Shader.TileMode.MIRROR);
    paint.setShader(shader);    //为画笔设置渐变器
    canvas.drawRect(10, 70, 100, 150, paint);    //绘制矩形
    //径向渐变
    shader=new RadialGradient(160, 110, 50, Color.RED, Color.GREEN, Shader.TileMode.MIRROR);
    paint.setShader(shader);    //为画笔设置渐变器
    canvas.drawCircle(160, 110, 50, paint);
    //角度渐变
    shader=new SweepGradient(265,110,new int[]{Color.RED,Color.GREEN,Color.BLUE},null);
    paint.setShader(shader);
    canvas.drawRect(220, 70, 310, 150, paint);  //绘制矩形
}
/**
 * 1.绘制奥运五环
 */
public void drawAoYunWuHuan(Paint paint,Canvas canvas) {
    paint.setAntiAlias(true);        //使用抗锯齿功能
    paint.setStrokeWidth(3);        //设置笔触的宽度
    paint.setStyle(Style.STROKE);    //设置填充样式为描边
    paint.setColor(Color.BLUE);
    canvas.drawCircle(50, 50, 30, paint);    //绘制蓝色的圆形
    paint.setColor(Color.YELLOW);
    canvas.drawCircle(100, 50, 30, paint);    //绘制黄色的圆形
    paint.setColor(Color.BLACK);
    canvas.drawCircle(150, 50, 30, paint);    //绘制黑色的圆形
    paint.setColor(Color.GREEN);
    canvas.drawCircle(75, 90, 30, paint);    //绘制绿色的圆形
    paint.setColor(Color.RED);
    canvas.drawCircle(125, 90, 30, paint);    //绘制红色的圆形
}
/**
 * 2.绘制一个游戏对白界面
 * 在Android中虽然可以用TextView或图片显示文本
 * 但是在开发游戏时,会包含很多文字,使用TextView和图片显示文本不太合适
 * 这时候,需要通过绘制文本的方式来实现。
 */
public void drawGameView(Paint paint,Canvas canvas) {
    paint.setColor(Color.BLACK);        //设置画笔颜色
    paint.setTextAlign(Paint.Align.LEFT);    //设置文字左对齐
    paint.setTextSize(16);        //设置文字大小
    paint.setAntiAlias(true);    //使用抗锯齿功能
    canvas.drawText("不,我不想去!", 20, 90, paint);    //通过drawText()方法绘制文字
    float[] pos= new float[]{20,20,
            45,20,
            70,20,
            95,20,
            120,20,
            145,20,
            170,20,
            195,20,
            220,20,
            245,20,
            270,20};    //定义代表文字位置的数组
    // 通过drawPosText()方法绘制文字,pose用于指定每一个字符的位置
    // 但官方现在已经不推荐使用该方法!!
    canvas.drawPosText("你想和我一起去探险吗?", pos, paint);
}
/**
 * 3.绘制路径及绕路径文字
 */
public void drawPathText(Paint paint,Canvas canvas) {
    paint.setAntiAlias(true);    //设置使用抗锯齿功能
    paint.setColor(0xFFFF6600);    //设置画笔颜色
    paint.setTextSize(18);    //设置文字大小
    paint.setStyle(Style.STROKE);    //设置填充方式为描边
    //绘制圆形路径
    Path pathCircle=new Path();//创建并实例化一个path对象
    pathCircle.addCircle(70, 70, 40, Path.Direction.CCW);    //添加逆时针的圆形路径
    canvas.drawPath(pathCircle, paint);    //绘制路径
    //绘制折线路径
    Path pathLine=new Path();        //创建并实例化一个Path对象
    pathLine.moveTo(150, 100);        //设置起始点
    pathLine.lineTo(200, 45);        //设置第一段直线的结束点
    pathLine.lineTo(250, 100);        //设置第二段直线的结束点
    pathLine.lineTo(300, 80);        //设置第3段直线的结束点
    canvas.drawPath(pathLine, paint);    //绘制路径
    //绘制三角形路径
    Path pathTr=new Path();    //创建并实例化一个path对象
    pathTr.moveTo(70,300);    //设置起始点
    pathTr.lineTo(120, 270);    //设置第一条边的结束点,也是第二条边的起始点
    pathTr.lineTo(170, 300);    //设置第二条边的结束点,也是第3条边的起始点
    pathTr.close();            //闭合路径
    canvas.drawPath(pathTr, paint);    //绘制路径
    //绘制绕路径的环形文字
    String str="风萧萧兮易水寒,壮士一去兮不复还";
    Path path=new Path();        //创建并实例化一个path对象
    path.addCircle(200, 200, 48, Path.Direction.CW);        //添加顺时针的圆形路径
    paint.setStyle(Paint.Style.FILL);//设置画笔的填充方式
    canvas.drawTextOnPath(str, path,0, -18, paint);    //绘制绕路径文字
}
/**
 * 4.绘制Android的机器人
 */
public void drawAndroidMan(Paint paint,Canvas canvas) {
    paint.setAntiAlias(true);    //使用抗锯齿功能
    paint.setColor(0xFFA4C739);    //设置画笔的颜色为绿色
    //绘制机器人的头
    RectF rectf_head=new RectF(10, 10, 100, 100);
    rectf_head.offset(100, 20);
    canvas.drawArc(rectf_head, -10, -160, false, paint);    //绘制弧
    //绘制眼睛
    paint.setColor(Color.WHITE);    //设置画笔的颜色为白色
    canvas.drawCircle(135, 53, 4, paint);    //绘制圆
    canvas.drawCircle(175, 53, 4, paint);    //绘制圆
    paint.setColor(0xFFA4C739);    //设置画笔的颜色为绿色
    //绘制天线
    paint.setStrokeWidth(2);    //设置笔触的宽度
    canvas.drawLine(120, 15, 135, 35, paint);    //绘制线
    canvas.drawLine(190, 15, 175, 35, paint);    //绘制线
    //绘制身体
    canvas.drawRect(110, 75, 200, 150, paint);    //绘制矩形
    RectF rectf_body=new RectF(110,140,200,160);
    canvas.drawRoundRect(rectf_body, 10, 10, paint);    //绘制圆角矩形
    //绘制胳膊
    RectF rectf_arm=new RectF(85,75,105,140);
    canvas.drawRoundRect(rectf_arm, 10, 10, paint);    //绘制左侧的胳膊
    rectf_arm.offset(120, 0);                            //设置在X轴上偏移120像素
    canvas.drawRoundRect(rectf_arm, 10, 10, paint);    //绘制右侧的胳膊
    //绘制腿
    RectF rectf_leg=new RectF(125,150,145,200);
    canvas.drawRoundRect(rectf_leg, 10, 10, paint);    //绘制左侧的腿
    rectf_leg.offset(40, 0);                            //设置在X轴上偏移40像素
    canvas.drawRoundRect(rectf_leg, 10, 10, paint);    //绘制右侧的腿
}
/**
 * 5.绘制彩色字符串
 */
public void drawColorfulString(Paint paint,Canvas canvas) {
    paint.setColor(0xFFFF6600);        //设置画笔颜色
    paint.setTextAlign(Paint.Align.LEFT);    //设置文字左对齐
    paint.setTextSize(30);        //设置文字大小
    paint.setAntiAlias(true);    //使用抗锯齿功能
    String text="梅花香自苦寒来";
    int[] colors = {0xFFFF6600 ,0xFF00FFEA, Color.RED, Color.GREEN, Color.BLUE,Color.YELLOW ,0xFFC600FF};    // 创建颜色数组
    for (int i = 0; i < text.length(); i++) {
        paint.setColor(colors[i % 7]);                                     // 选择颜色
        canvas.drawText(text.charAt(i) + "", 45 + i * 45, 60,paint);                 // 绘制文本信息
    }
}
/**
 * 6.绘制一个随机数字组成的验证码
 */
public void drawRadomNumberVerify(Paint paint,Canvas canvas) {
    paint.setColor(Color.RED);
    Random r =new Random(new java.util.Date().getTime()+1);
    String str=String.valueOf(r.nextInt());
    canvas.drawText(str, 50, 50, paint);
}
/**
 * 7.使用 Matrix 旋转 图像
 */
public void drawRotate(Paint paint,Canvas canvas) {
    paint.setAntiAlias(true);
    Bitmap bitmap_rabbit=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.rabbit);
    canvas.drawBitmap(bitmap_rabbit, 0, 0, paint);        // 绘制原图
    //应用setRotate(float degrees)方法旋转图像
    Matrix matrix=new Matrix();
    matrix.setRotate(30);                        // 以(0,0)点为轴心转换30度
    canvas.drawBitmap(bitmap_rabbit, matrix, paint);    // 绘制图像并应用matrix的变换
    //应用setRotate(float degrees, float px, float py)方法旋转图像
    Matrix m=new Matrix();
    m.setRotate(90,87,87);                        // 以(87,87)点为轴心转换90度
    canvas.drawBitmap(bitmap_rabbit, m, paint);        // 绘制图像并应用matrix的变换
}
/**
 * 8.使用 Matrix 缩放 图像
 */
public void drawScale(Paint paint,Canvas canvas) {
    paint.setAntiAlias(true);
    Bitmap bitmap_rabbit=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.rabbit);
    //应用setScale(float sx, float sy)方法缩放图像
    Matrix matrix=new Matrix();
    matrix.setScale(2f, 2f);                        // 以(0,0)点为轴心将图像在X轴和Y轴均缩放200%
    canvas.drawBitmap(bitmap_rabbit, matrix, paint);    // 绘制图像并应用matrix的变换

// 应用setScale(float sx, float sy, float px, float py) 方法缩放图像

    Matrix m=new Matrix();
    m.setScale(0.8f,0.8f,156,156);                        // 以(156,156)点为轴心将图像在X轴和Y轴均缩放80%
    canvas.drawBitmap(bitmap_rabbit, m, paint);        // 绘制图像并应用matrix的变换
    canvas.drawBitmap(bitmap_rabbit, 0, 0, paint);        // 绘制原图
}
/**
 * 9.使用 Matrix 倾斜 图像
 */
public void drawSkew(Paint paint,Canvas canvas) {
    paint.setAntiAlias(true);
    Bitmap bitmap_rabbit=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.rabbit);
    //应用setSkew(float sx, float sy)方法倾斜图像
    Matrix matrix=new Matrix();
    matrix.setSkew(2f, 1f);            // 以(0,0)点为轴心将图像在X轴上倾斜2,在Y轴上倾斜1
    canvas.drawBitmap(bitmap_rabbit, matrix, paint);    // 绘制图像并应用matrix的变换
    //应用setSkew(float sx, float sy, float px, float py) 方法倾斜图像
    Matrix m=new Matrix();
    m.setSkew(-0.5f, 0f,78,69);            // 以(78,69)点为轴心将图像在X轴上倾斜-0.5
    canvas.drawBitmap(bitmap_rabbit, m, paint);        // 绘制图像并应用matrix的变换
    canvas.drawBitmap(bitmap_rabbit, 0, 0, paint);        // 绘制原图
}
/**
 * 10.使用 Matrix 旋转后平移 图像
 */
public void drawRotateTranslate(Paint paint,Canvas canvas) {
    paint.setAntiAlias(true);    //使用抗锯齿功能
    Bitmap bitmap_rabbit=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.rabbit);
    canvas.drawBitmap(bitmap_rabbit, 0, 0, paint);        // 绘制原图
    Matrix matrix=new Matrix();                // 创建一个Matrix的对象
    matrix.setRotate(30);                    // 将matrix旋转30度
    matrix.postTranslate(100,50);            // 将matrix平移到(100,50)的位置
    canvas.drawBitmap(bitmap_rabbit, matrix, paint);    // 绘制图像并应用matrix的变换
}

}

布局代码:

=====

activity_main.xml:


<LinearLayout 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"
          android:orientation="vertical"
          android:paddingBottom="@dimen/activity_vertical_margin"
          android:paddingLeft="@dimen/activity_horizontal_margin"
          android:paddingRight="@dimen/activity_horizontal_margin"
          android:paddingTop="@dimen/activity_vertical_margin"
          tools:context=".MainActivity">
<FrameLayout
    android:id="@+id/frameLayout0"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:background="#ffffff"
    ></FrameLayout>
<ScrollView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <Button
            android:id="@+id/btn0"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="0.绘制以渐变色填充的矩形"/>
        <Button
            android:id="@+id/btn1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="1.绘制奥运五环"/>
        <Button
            android:id="@+id/btn2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="2.绘制游戏对白界面"/>
        <Button
            android:id="@+id/btn3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="3.绘制路径及绕路径文字"/>
        <Button
            android:id="@+id/btn4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="4.绘制Android的机器人"/>
        <Button
            android:id="@+id/btn5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="5.绘制彩色字符串"/>
        <Button
            android:id="@+id/btn6"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="6.绘制一个随机数字组成的验证码"/>
        <Button
            android:id="@+id/btn7"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="7.使用 Matrix 旋转 图像"/>
        <Button
            android:id="@+id/btn8"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="8.使用 Matrix 缩放 图像"/>
        <Button
            android:id="@+id/btn9"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="9.使用 Matrix 倾斜 图像"/>
        <Button
            android:id="@+id/btn10"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left|center"
            android:text="10.使用 Matrix 旋转后平移 图像"/>
    </LinearLayout>
</ScrollView>

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

架构篇

《Jetpack全家桶打造全新Google标准架构模式》

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

帮助,可以扫码获取!!(备注:Android)**

[外链图片转存中…(img-Y3UV3LLu-1713750058685)]

尾声

如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。[外链图片转存中…(img-6Ud5l5Tw-1713750058686)]

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-N4RcEgc6-1713750058687)]

架构篇

《Jetpack全家桶打造全新Google标准架构模式》
[外链图片转存中…(img-4BtkHVtf-1713750058688)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值