目录
1. bitmap图片Bitmap类普通方法:静态方法: BitmapFactory类 2. 绘图常用工具类2.1 Panit 画笔Paint 属性图形绘制属性:文本绘制属性: 2.2 Canvas 画布drawXXX()方法族其他常用方法: 2.3 Path 路径PathEffect类的常用方法: 3. 绘制图像4. 实践| 绘制Android机器人1. bitmap图片
Bitmap类
Bitmap类是位图类,在Android负责图像处理的一个类,可以将它看成是一个画架,先把画放到画架上面,然后可以进行一些处理,比如获取图像文件信息,进行图像旋转切割,放大缩小等操作。
Bitmap提供了一些方法,有普通方法和静态方法:
普通方法:
静态方法:
BitmapFactory类
由于Bitmap类的构造函数是私有的,外面并不能实例化。这必然是某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。
BitmapFactory提供了一些常用的方法如下:
2. 绘图常用工具类
2.1 Panit 画笔
Panit 顾名思义即画笔,用于设置绘制风格,如:线宽(笔触粗细),颜色,透明度和填充风格等。
使用语法:
直接使用无参构造方法就可以创建Paint实例:
// 创建一个Paint实例Paint paint = new Paint( );
Paint 属性
Paint属性大致上分为:图形绘制属性和文本绘制属性两种
图形绘制属性:
文本绘制属性:
2.2 Canvas 画布
Canvas:即画布,就是画画的一块画布,就这简单粗暴的理解哈~
Canvas构造方法
Canvas(): 创建一个空画布,使用setBitmap() 来绘制具体的画布Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,将内容都绘制在bitmap上,因此bitmap不得为null。
绘制方法:
drawXXX()方法族
其他常用方法:
save()和restore()要配对使用,restore不能比save多,若restore调用次数比save多,会报错!
2.3 Path 路径
Path:路径即大致框架的点线相连接,在创建好Path路径后,可以调用Canvas的drawPath(path,paint) 将图形绘制出来,路径中常用的方法如下:
addArc(RectF oval, float startAngle, float sweepAngle:为路径添加一个多边形addCircle(float x, float y, float radius, Path.Direction dir):给path添加圆圈addOval(RectF oval, Path.Direction dir):添加椭圆形addRect(RectF rect, Path.Direction dir):添加一个区域addRoundRect(RectF rect, float[] radii, Path.Direction dir):添加一个圆角区域isEmpty():判断路径是否为空transform(Matrix matrix):应用矩阵变换(Matrix matrix, Path dst):应用矩阵变换并将结果放到新的路径中,即第二个参数。
PathEffect类的常用方法:
3. 绘制图像
上面介绍完了三个绘图工具类基本方法,接下来来如何应用工具类中方法来绘制各种图片:
基本步骤:
在绘制图像之前需要先创建一个java类,让其继承自android.view.View类,并为其添加构造方法与重写onDraw方法,绘制图像的代码都要写在onDraw()方法中,从而实绘制图像的实现。
1、我这里定义一个名为MyView
的类继承android.view.View类:
2、添加构造方法:onDraw()
方法并重写onDraw()方法
package com.example.draw;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.RectF;import android.view.View;public class MyView extends View {public MyRobot(Context context) {super(context);}// 添加构造方法:onDraw()方法 绘制图像的所有代码都在此方法中实现@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);}}
4. 实践| 绘制Android机器人
放上绘制的小demo:绘制Android机器人
定义一个帧布局管理器,因为图像绘制是一层一层往上画的,所以这个用FramLayout比较好实现。
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/framlayout"android:layout_width="match_parent"android:layout_marginTop="300dp"android:layout_marginLeft="150dp"android:layout_height="match_parent"tools:context=".RobotActivity"></FrameLayout>
自定义MyRobot.java类继承android.view.View类,在onDraw() 方法中实现绘制:
package com.example.draw;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.RectF;import android.view.View;public class MyRobot extends View {public MyRobot(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 绘制机器人Paint paint = new Paint(); // 创建一个画笔paint.setAntiAlias(true); // 抗锯齿 使它更加圆滑paint.setColor(0xFFA4C739);// 绘制机器人的头RectF rectF = new RectF(10,10,100,100); //定义外轮廓矩形rectF.offset(90,20);canvas.drawArc(rectF,-10,-160,false,paint); //绘制弧// 绘制眼睛paint.setColor(0xFFFFFFFF); //设置画笔为白色canvas.drawCircle(165,53,4,paint); //绘制圆canvas.drawCircle(125,53,4,paint);//绘制天线paint.setColor(0xFFA4C739); //设置画笔颜色paint.setStrokeWidth(2); // 设置画笔的宽度canvas.drawLine(110,15,125,35,paint); //绘制线canvas.drawLine(180,15,165,35,paint); //绘制线// 绘制身体canvas.drawRect(100,75,190,150,paint); //绘制矩形RectF rectF_body = new RectF(100,140,190,160);canvas.drawRoundRect(rectF_body,10,10,paint); //绘制圆角矩形// 绘制胳膊RectF rectF_arm = new RectF(75,75,95,140);canvas.drawRoundRect(rectF_arm,10,10,paint); //绘制圆角矩形rectF_arm.offset(120,0);canvas.drawRoundRect(rectF_arm,10,10,paint); //绘制圆角矩形//绘制腿RectF rectF_leg = new RectF(115,150,135,200);canvas.drawRoundRect(rectF_leg,10,10,paint); //绘制圆角矩形rectF_leg.offset(40,0);canvas.drawRoundRect(rectF_leg,10,10,paint); //绘制圆角矩形}}
将自定义的view添加到帧布局管理器中:
package com.example.draw;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.widget.FrameLayout;import com.example.draw.MyRobot;public class RobotActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_android_robot);// 获取帧布局管理器FrameLayout frameLayout = (FrameLayout) findViewById(R.id.framlayout);//将自定义的view添加到帧布局布局管理器中frameLayout.addView(new MyRobot(this)); }}
学习参考文档:https://developer./guide/topics/graphics/drawables
学习参考文档:/w3cnote/android-tutorial-intro.html