2019-10-14 14:44:31 stanwuc 阅读数 285

绘图

一、画笔(Paint)和画布(Canvas)

  • 就是自定义View,继承View,重写ondraw方法
  • onDraw里面创建画笔的对象设置相关的参数
  • 调用canvas 的方法绘图,需要设置画笔
  • 说明:设置画笔的颜色的时候一定要设置透明度,安卓默认是完全透明的,不这设置的话就看不到了

二、绘制几何图形

绘制安卓机器人

public class Robot extends View {
    public Robot(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //define paint
        Paint paint = new Paint();
        paint.setColor(0xFF7FB446);
        paint.setAntiAlias(true);

        //draw head
        RectF rectF_head = new RectF(100, 100, 200, 200);
        canvas.drawArc(rectF_head, -10, -160, false, paint);

        // draw eyes
        paint.setColor(0xFFFFFFFF);
        canvas.drawCircle(125, 125, 3, paint);
        canvas.drawCircle(175, 125, 3, paint);

        //draw ears
        paint.setColor(0xFF7FB446);
        paint.setStrokeWidth(4);
        canvas.drawLine(100, 100, 120, 120, paint);
        canvas.drawLine(200, 100, 172, 120, paint);

        //draw body
        RectF rectF_body = new RectF(100, 150, 200, 250);
        canvas.drawRect(rectF_body, paint);
        rectF_body = new RectF(100, 200, 200, 260);
        canvas.drawRoundRect(rectF_body, 10, 10, paint);

        //draw legs
        RectF rectF_leg = new RectF(125, 250, 145, 300);
        canvas.drawRoundRect(rectF_leg, 10, 10, paint);
        rectF_leg = new RectF(155, 250, 175, 300);
        canvas.drawRoundRect(rectF_leg, 10, 10, paint);

        //draw arms
        RectF rectF_arms = new RectF(70, 150, 90, 230);
        canvas.drawRoundRect(rectF_arms, 10, 10, paint);
        rectF_arms = new RectF(210, 150, 230, 230);
        canvas.drawRoundRect(rectF_arms, 10, 10, paint);
    }
}

三、绘制文本

paint.setTextAlign(Paint.Align.LEFT);
paint.setTextSize(12);
canvas.drawText("文字绘制测试",100,400,paint);

四、绘制图片

1、Bitmap & BitmapFactory

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、示例代码

  • 这里是分别用 bitmap 和 bitmapFactory 绘制
Paint paint = new Paint();
String path = (Environment.getExternalStorageDirectory())+"/robot.jpg";
Bitmap bitmap = BitmapFactory.decodeFile(path);
canvas.drawBitmap(bitmap,0,0,paint);
//下面的代码对图片进行了截取
Bitmap bitmap2 = Bitmap.createBitmap(bitmap,0,0,234,300);
canvas.drawBitmap(bitmap2,250,0,paint);
  • 以上的代码实现需要通过DDMS上传一张名为 robot.jpg 的图片到模拟器的 sdcard
  • 为了保证能够获取到图片,需要在配置访问 sd 卡的权限,如下所示,同时模拟器上开启应用的访问权限
<!--manifest配置-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>

五、绘制路径

在这里插入图片描述

Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(0xFF000000);
paint.setStyle(Paint.Style.STROKE);
Path path = new Path();
path.addCircle(200,200,100,Path.Direction.CCW);
//canvas.drawPath(path,paint);
String str = "test module test moduletest module test module test moduletest module test module";
canvas.drawTextOnPath(str,path,0,0,paint);

动画

一、逐帧动画

  • 准备动画资源
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/img001"
        android:duration="60" />
    <item
        android:drawable="@drawable/img002"
        android:duration="60" />
    <item
        android:drawable="@drawable/img003"
        android:duration="60" />
    <item
        android:drawable="@drawable/img004"
        android:duration="60" />
    <item
        android:drawable="@drawable/img005"
        android:duration="60" />
    <item
        android:drawable="@drawable/img006"
        android:duration="60" />
</animation-list>
  • 使用动画资源:这里的 fairy xml 动画资源是放置在drawable目录下的
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/lay"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/fairy"
    android:orientation="vertical"
    tools:context=".MainActivity">
</LinearLayout>
  • 控制动画播放:默认使用横屏可以在 manifest 相应的 activity 设置属性android:screenOrientation="landscape"
public class MainActivity extends AppCompatActivity {
    private boolean flag = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.lay);
        final AnimationDrawable animation = (AnimationDrawable) linearLayout.getBackground();

        linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (flag) {
                    animation.start();
                    flag = false;
                } else {
                    animation.stop();
                    flag = true;
                }
            }
        });
    }
}

二、补间动画

1、补间动画的概念

  • 补间动画就是我们只需要提供初始的帧和最终的帧,安卓会帮我们自动补上动画中间的帧
  • 但是补间动画不是万能,安卓只支持如下的四种,分别用如下的标记来定义
    在这里插入图片描述

2、旋转动画的实现

  • 动画资源:这些动画资源是放在anim文件夹下的
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="360"
        android:duration="2000"/>
</set>
  • MainActivity
final ImageView imageView = (ImageView)findViewById(R.id.iv);
imageView.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Animation animation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.anim_rotate);
		imageView.startAnimation(animation);
	}
});
2017-03-05 00:00:24 qq_31718279 阅读数 554

1.简单图片

<1>Bitmap

<2>BitmapFactory

【Android】图形图像处理之”简单图片“

(这里包含一个图片放大器实例)

2.逐帧动画

<1>Animation

<2>AnimationDrawable

【Android】图形图像处理之“逐帧动画”(XML)

(这里包含一个飞奔的骏马动画实例及其图片资源)

【Android】图形图像处理之“逐帧动画”(java)

(这里包含一个飞奔的骏马动画实例及其图片资源)

【Android】图形图像处理之“逐帧动画”(单张JPG处理)

(这里包含一个飞行的小鸟动画实例及其图片资源)

3.自定义绘画

<1>Canvas

<2>Paint

<3>Path

【Android】图形图像处理之”自定义绘画”

(这里面包含了几种自定义绘图样式)

2015-09-17 20:22:50 TaooLee 阅读数 1685

设置两张图片重叠的模式。
在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。
而setXfermode就可以来解决这个问题 .
这里写图片描述
举例这里写图片描述

重叠的图层使用BitmapCanvas画布。。注意下面

public class MyBitmapView2 extends View {
    private int width;
    private int height;

    private Paint paintCircle;
    private Paint paintRect;

    private Bitmap bitmap;
    private Canvas bitmapCanvas;

    public MyBitmapView2(Context context, AttributeSet attrs) {
        super(context, attrs);
        paintCircle = new Paint();
        paintRect = new Paint();
        paintRect.setColor(Color.GREEN);
        paintCircle.setColor(Color.YELLOW);

        //设置画笔图层在上
        PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.DST_OVER);
        paintRect.setXfermode(mode);


    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(width, height);


        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmapCanvas = new Canvas(bitmap);//bitmap画布
    }

    @Override
    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);
        canvas.drawColor(Color.RED);
        bitmapCanvas.drawCircle(width / 2, height / 2, width / 2, paintCircle);
        bitmapCanvas.drawRect(0, 0, width / 2, width / 2, paintRect);

        canvas.drawBitmap(bitmap, 0, 0, null);

    }


}
2019-03-15 22:53:05 zhang_zxk 阅读数 1142

 

一、常用户绘图类

1 Paint类

Paint类代表画笔,用来描述图形的颜色和风格,如线宽、颜色、透明度和填充效果等信息。使用Paint类时,需要先创建该类的对象,这可以通过该类提供的构造方法来实现。通常情况下,只需要使用无参数的构造方法来创建一个使用默认设置的Paint对象,具体代码如下:

Paint paint=new Paint();

Paint类的常用方法

方法

描述

setARGB(int a, int r, int g, int b)

用于设置颜色,各参数值均为0~255之间的整数,分别用于表示透明度、红色、绿色和蓝色值

setColor(int color)

用于设置颜色,参数color可以通过Color类提供的颜色常量指定,也可以通过Color.rgb(int red,int green,int blue)方法指定

setAlpha(int a)

用于设置透明度,值为0~255之间的整数

setAntiAlias(boolean aa)

用于指定是否使用抗锯齿功能,如果使用会使绘图速度变慢

setDither(boolean dither)

用于指定是否使用图像抖动处理,如果使用会使图像颜色更加平滑和饱满,更加清晰

setPathEffect(PathEffect effect)

用于设置绘制路径时的路径效果,例如点画线

setShader(Shader shader)

用于设置渐变,可以使用LinearGradient(线性渐变)、RadialGradient(径向渐变)或者SweepGradient(角度渐变)

setShadowLayer(float radius, float dx, float dy, int color)

用于设置阴影,参数radius为阴影的角度,dxdy为阴影在x轴和y轴上的距离,color为阴影的颜色。如果参数radius的值为0,那么将没有阴影

setStrokeCap(Paint.Cap cap)

用于当画笔的填充样式为STROKEFILL_AND_STROKE时,设置笔刷的图形样式,参数值可以是Cap.BUTTCap.ROUNDCap.SQUARE。主要体现在线的端点上

setStrokeJoin(Paint.Join join)

用于设置画笔转弯处的连接风格,参数值为Join.BEVELJoin.MITERJoin.ROUND

setStrokeWidth(float width)

用于设置笔触的宽度

setStyle(Paint.Style style)

用于设置填充风格,参数值为Style.FILLStyle.FILL_AND_STROKEStyle.STROKE

setTextAlign(Paint.Align align)

用于设置绘制文本时的文字对齐方式,参数值为Align.CENTERAlign.LEFTAlign.RIGHT

setTextSize(float textSize)

用于设置绘制文本时的文字的大小

setFakeBoldText(boolean fakeBoldText)

用于设置是否为粗体文字

setXfermode(Xfermode xfermode)

用于设置图形重叠时的处理方式,例如合并、取交集或并集,经常用来制作橡皮的擦除效果

 

2 Canvas类

Canvas类代表画布,通过该类提供的方法,我们可以绘制各种图形(例如,矩形、圆形和线条等)。通常情况下,要在Android中绘图,需要先创建一个继承自View类的视图,并且在该类中重写它的onDraw(Canvas canvas)方法,然后在显示绘图的Activity中添加该视图。

创建自定义类绘图

(1)创建一个名称为DrawView的类,并添加构造方法、重写onDraw方法

public class DrawView extends View {

	/**
	 * 功能:构造方法
	 */
	public DrawView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}


	/* 
	 * 功能:重写onDraw()方法
	 */
	@Override
	protected void onDraw(Canvas canvas) {
		Paint paint=new Paint();	//定义一个采用默认设置的画笔
		paint.setColor(Color.RED);	//设置颜色为红色
		paint.setShadowLayer(2, 3, 3, Color.rgb(180, 180, 180));	//设置阴影
		canvas.drawRect(40, 40, 200, 100, paint);		//绘制矩形	
		super.onDraw(canvas);
	}

}

(2)在布局文件中添加自定义的DrawView视图

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <com.administrator.DrawView
        android:id="@+id/drawView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    
</FrameLayout>

3 Bitmap类

       Bitmap类代表位图,它是Android系统中图像处理的最重要类之一。使用它不仅可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,而且还可以指定格式保存图像文件。Bitmap类提供的常用方法如下表所示。

方法

描述

compress(Bitmap.CompressFormat format, int quality, OutputStream stream)

用于将Bitmap对象压缩为指定格式并保存到指定的文件输出流中,其中format参数值可以是Bitmap.CompressFormat.PNGBitmap.CompressFormat. JPEGBitmap.CompressFormat.WEBP

createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

用于从源位图的指定坐标点开始,“挖取”指定宽度和高度的一块图像来创建新的Bitmap对象,并按Matrix指定规则进行变换

createBitmap(int width, int height, Bitmap.Config config)

用于创建一个指定宽度和高度的新的Bitmap对象

createBitmap(Bitmap source, int x, int y, int width, int height)

用于从源位图的指定坐标点开始,“挖取”指定宽度、和高度的一块图像来创建新的Bitmap对象

createBitmap(int[] colors, int width, int height, Bitmap.Config config)

使用颜色数组创建一个指定宽度和高度的新Bitimap对象,其中,数组元素的个数为width*height

createBitmap(Bitmap src)

用于使用源位图创建一个新的Bitmap对象

createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)

用于将源位图缩放为指定宽度和高度的新的Bitmap对象

isRecycled()

用于判断Bitmap对象是否被回收

recycle()

强制回收Bitmap对象

 

创建一个包括4个像素的Bitmap对象

Bitmap bitmap=Bitmap.createBitmap(new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.MAGENTA}, 4, 1, Config.RGB_565);

4 BitmapFactory类

Android中,还提供了一个BitmapFactory类,该类为一个工具类,用于从不同的数据源来解析、创建Bitmap对象。BitmapFactory类提供的创建Bitmap对象的常用方法如下表所示。

方法

描述

decodeFile(String pathName)

用于从给定的路径所指定的文件中解析、创建Bitmap对象

decodeFileDescriptor(FileDescriptor fd)

用于从FileDescriptor对应的文件中解析、创建Bitmap对象

decodeResource(Resources res, int id)

用于根据给定的资源ID从指定的资源中解析、创建Bitmap对象

decodeStream(InputStream is)

用于从指定的输入流中解析、创建Bitmap对象

 

实例1:解析SD卡上的图片文件img01.jpg,并创建对应的Bitmap对象

String path="/sdcard/pictures/bccd/img01.jpg";
Bitmap bm=BitmapFactory.decodeFile(path);

实例2:解析Drawable资源中保存的图片文件img02.jpg,并创建对应的Bitmap对象

Bitmap bm=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.img02);

二、绘制2D图像

1 绘制几何图形

在Android中,Canvas类提供了丰富的绘制几何图形的方法。

上面绘图效果使用的画笔代码如下:

Paint paint=new Paint();
paint.setAntiAlias(true);//使用抗锯齿功能
paint.setColor(Color.RED);
paint.setStrokeWidth(2);
paint.setStyle(Style.STROKE);//填充样式为描边

2 绘制文本

2.1 drawText()方法:用于在画布的指定位置绘制文字。语法格式如下:

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

Paint paint=new Paint();
paint.setTextSize(16);
canvas.drawText("Hello world!",100,50,paint);

2.2 drawPosText()方法:也是在画布上绘制文字,与drawText()方法不同的是,使用该方法绘制字符串时,需要为每个字符串制定一个位置。语法格式如下:

drawPosText(String text, float[] pos, Paint paint)

Paint paint=new Paint();
paint.setTextSize(24);
float[] pos=new float[]{80,215,105,215,130,215};
canvas.drawPosText("你好啊",pos,paint);

3 绘制路径

3.1 创建路径:使用android.graphics.Path类来实现。Path类的常用绘图方法如下:

方法

描述

addArc(RectF oval, float startAngle, float sweepAngle)

添加弧形路径

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

添加圆形路径

addOval(RectF oval, Path.Direction dir)

添加椭圆形路径

addRect(RectF rect, Path.Direction dir)

添加矩形路径

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

添加圆角矩形路径

moveTo(float x, float y)

设置开始绘制直线的起始点

lineTo(float x, float y)

moveTo()方法设置的起始点与该方法指定的结束点之间画一条直线,如果在调用该方法之前没使用moveTo()方法设置起始点,那么将从(0,0)点开始绘制直线

quadTo(float x1, float y1, float x2, float y2)

用于根据指定的的参数绘制一条线段轨迹

close()

闭合路径

 

3.1 将定义好的路径绘制在画布上

使用Canvas类提供的drawPath()方法可以将定义好的路径绘制在画布上。

            Paint paint=new Paint();	//创建一个画笔
			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(350,80);	//设置起始点
			pathTr.lineTo(400, 30);	//设置第一条边的结束点,也是第二条边的起始点
			pathTr.lineTo(450, 80);	//设置第二条边的结束点,也是第3条边的起始点
			pathTr.close();			//闭合路径
			canvas.drawPath(pathTr, paint);	//绘制路径
			//绘制绕路径的环形文字
			String str="风萧萧兮易水寒,壮士一去兮不复还";
			Path path=new Path();		//创建并实例化一个path对象
			path.addCircle(550, 100, 48, Path.Direction.CW);		//添加顺时针的圆形路径		
			paint.setStyle(Style.FILL);//设置画笔的填充方式
			canvas.drawTextOnPath(str, path,0, -18, paint);	//绘制绕路径文字

效果:

4 绘制图片

使用Canvas类绘制图片,只需要使用Canvas类提供的如下表所示的方法来将Bitmap对象中保存的图片绘制到画布上就可以了。

方法

描述

drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)

用于从指定点绘制从源位图中“挖取”的一块

drawBitmap(Bitmap bitmap, float left, float top, Paint paint)

用于在指定点绘制位图

drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)

用于从指定点绘制从源位图中“挖取”的一块

三、为图形添加特效

1 旋转图像

使用Android提供的android.graphics.Matrix类的setRotate()postRotate()preRotate()方法,可以对图像进行旋转

setRotate(float degrees)

setRotate(float degrees, float px, float py)

                        Paint paint=new Paint();							// 定义一个画笔
			paint.setAntiAlias(true);
			Bitmap bitmap_bg=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.background);
			canvas.drawBitmap(bitmap_bg, 0, 0, paint);			//绘制背景图像
			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的变换

2 缩放图像

使用Android提供的android.graphics.Matrix类的setScale()postScale()和、preScale()方法,可对图像进行缩放。由于这3个方法除了方法名不同外,语法格式等均相同,下面以setScale()为例介绍。

setScale(float sx, float sy)

setScale(float sx, float sy, float px, float py)

Paint paint=new Paint();							// 定义一个画笔
			paint.setAntiAlias(true);
			Bitmap bitmap_bg=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.background);
			canvas.drawBitmap(bitmap_bg, 0, 0, paint);		// 绘制背景
			
			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);		// 绘制原图

3 倾斜图像

使用Android提供的android.graphics.Matrix类的setSkew()postSkew()和、preSkew()方法,可对图像进行倾斜。

setSkew(float kx, float ky)

setSkew(float kx, float ky, float px, float py)

Paint paint=new Paint();							// 定义一个画笔
			paint.setAntiAlias(true);
			Bitmap bitmap_bg=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.background);
			canvas.drawBitmap(bitmap_bg, 0, 0, paint);		// 绘制背景

			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);		// 绘制原图

4 平移图像

使用Android提供的android.graphics.Matrix类的setTranslate()postTranslate()和、preTranslate()方法,可对图像进行平移。

setTranslate (float dx, float dy)

Paint paint=new Paint();							// 定义一个画笔
			paint.setAntiAlias(true);	//使用抗锯齿功能
			Bitmap bitmap_bg=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.background);
			canvas.drawBitmap(bitmap_bg, 0, 0, paint);		// 绘制背景

			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的变换

5 使用BitmapShader渲染图像

1)创建BitmapShader类的对象,可以通过以下的构造方法进行创建。

            BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)

2)通过PaintsetShader()方法来设置渲染对象。

3)在绘制图像时,使用已经设置了setShader()方法的画笔。

            Paint paint=new Paint();							// 定义一个画笔
			paint.setAntiAlias(true);	//使用抗锯齿功能
			Bitmap bitmap_bg=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.android);
			//创建一个在水平和垂直方向都重复的BitmapShader对象
			BitmapShader bitmapshader= new BitmapShader(bitmap_bg,TileMode.REPEAT,TileMode.REPEAT);
			paint.setShader(bitmapshader);	//设置渲染对象
			canvas.drawRect(0, 0, view_width, view_height, paint);		//绘制一个使用BitmapShader渲染的矩形	
			
			Bitmap bm=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.img02);
			//创建一个在水平方向上重复,在垂直方向上镜像的BitmapShader对象
			BitmapShader bs= new BitmapShader(bm,TileMode.REPEAT,TileMode.MIRROR);	
			paint.setShader(bs);	//设置渲染对象
			RectF oval=new RectF(0,0,280,180);
			canvas.translate(40, 20);		//将画面在X轴上平移40像素,在Y轴上平移20像素
			canvas.drawOval(oval, paint);	//绘制一个使用BitmapShader渲染的椭圆形

 

2019-06-06 08:47:22 fjnu_se 阅读数 261

Android图形图像处理

市面上大多数的Android程序都会用到图形图像处理技术,例如绘制图形,为图片添加特效等。在绘制图像时最常用的就是Bitmap类、BitmapFactory类、Paint类、Canvas类和Matrix类。其中,Bitmap类代表位图,BitmapFactory类顾名思义就是位图工厂,它是一个工具类,Paint类代表画笔,Canvas类代表画布,为图片添加特效使用的是Matrix类。本文将针对图形处理的API进行讲解。

Bitmap类

Bitmao类是Android系统中非常重要的图像处理类,它提供了一系列的方法,可对图像进行旋转、缩放等操作,并可以指定格式保存图像文件。Bitmap类提供的常用方法如下所示:

方法 描述
drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 绘制弧形
drawBitmap (Bitmap bitmap, float left, float top, Paint paint) 绘制位图
drawCircle (float cx, float cy, float radius, Paint paint) 绘制圆形
drawLine (float startX, float startY, float stopX, float stopY, Paint paint) 绘制一条线
drawPoint (float x, float y, Paint paint) 绘制一个点
drawRect (float left, float top, float right, float bottom, Paint paint) 绘制矩形
@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

            Paint paint = new Paint();
            super.onDraw(canvas);
            paint.setColor(Color.RED);
            paint.setStrokeWidth(5);
            paint.setStyle(Paint.Style.FILL);

            //绘制路径
            Path path = new Path();
            path.addArc(200, 200, 400, 400, -225, 225);
            path.arcTo(400, 200, 600, 400, -180, 225, false);
            path.lineTo(400, 542);
            //路径剪裁
            canvas.clipPath(path);
            canvas.drawRect(0, 0, 800, 800, paint);
    }

convas

Paint类常用方法

Paint类代表画笔,用来描述图形的颜色和风格,如线宽、颜色、透明度和填充效果等信息。使用Paint类时,首先要创建它的实例对象,然后通过该类提供的方法来更改Paint对象的默认设置。Paint类提供的常用方法如下:

方法 描述
setAlpha(int a) 设置透明度
setARGB(int a, int r, int g, int b) 绘制颜色
setColor(int color) 设置颜色
setShader(Shader shader) 设置渲染效果
setShadowLayer(float radius, float dx, float dy, int color) 设置阴影
setStrokeWidth(float width) 设置画笔粗细
 protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 把整张画布绘制成白色
        canvas.drawColor(Color.WHITE);
        Paint paint = new Paint();

        /**
         * 设置画笔的锯齿效果,去锯齿
         * 设置画笔颜色,蓝色
         * 设置画笔风格,空心
         * 设置空心画笔的宽度,3
         */
        paint.setAntiAlias(true);
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(3);

        /**
         * 绘制圆形
         * 绘制正方形
         * 绘制矩形
         */
        canvas.drawCircle(40, 40, 30, paint);
        canvas.drawRect(10, 80, 70, 140, paint);
        canvas.drawRect(10, 150, 70, 190, paint);

        RectF re1 = new RectF(10, 200, 70, 230);
        // 绘制圆角矩形
        canvas.drawRoundRect(re1, 15, 15, paint);
        RectF re11 = new RectF(10, 240, 70, 270);
        // 绘制椭圆
        canvas.drawOval(re11, paint);
        // 定义一个Path对象,封闭成一个三角形。
        Path path1 = new Path();
        path1.moveTo(10, 340);
        path1.lineTo(70, 340);
        path1.lineTo(40, 290);
        path1.close();
        // 根据Path进行绘制,绘制三角形
        canvas.drawPath(path1, paint);

        // 定义一个Path对象,封闭成一个五角形。
        Path path2 = new Path();
        path2.moveTo(26, 360);
        path2.lineTo(54, 360);
        path2.lineTo(70, 392);
        path2.lineTo(40, 420);
        path2.lineTo(10, 392);
        path2.close();
        // 根据Path进行绘制,绘制五角形
        canvas.drawPath(path2, paint);

        // ----------设置填充风格后绘制----------
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.RED);

        canvas.drawCircle(120, 40, 30, paint);
        canvas.drawRect(90, 80, 150, 140, paint);
        canvas.drawRect(90, 150, 150, 190, paint);

        RectF re2 = new RectF(90, 200, 150, 230);
        //绘制圆角矩形
        canvas.drawRoundRect(re2, 15, 15, paint);

        RectF re21 = new RectF(90, 240, 150, 270);
        // 绘制椭圆
        canvas.drawOval(re21, paint);

        Path path3 = new Path();
        path3.moveTo(90, 340);
        path3.lineTo(150, 340);
        path3.lineTo(120, 290);
        path3.close();
        //绘制三角形
        canvas.drawPath(path3, paint);

        Path path4 = new Path();
        path4.moveTo(106, 360);
        path4.lineTo(134, 360);
        path4.lineTo(150, 392);
        path4.lineTo(120, 420);
        path4.lineTo(90, 392);
        path4.close();
        //绘制五角形
        canvas.drawPath(path4, paint);

        // ----------设置渐变器后绘制----------
        // 为Paint设置渐变器
        Shader mShader = new LinearGradient(0, 0, 40, 60
                , new int[] {Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }
                , null , Shader.TileMode.REPEAT);
        paint.setShader(mShader);
        //设置阴影
        paint.setShadowLayer(45 , 10 , 10 , Color.GRAY);
        // 绘制圆形
        canvas.drawCircle(200, 40, 30, paint);
        // 绘制正方形
        canvas.drawRect(170, 80, 230, 140, paint);
        // 绘制矩形
        canvas.drawRect(170, 150, 230, 190, paint);

        RectF re3 = new RectF(170, 200, 230, 230);
        // 绘制圆角矩形
        canvas.drawRoundRect(re3, 15, 15, paint);

        RectF re31 = new RectF(170, 240, 230, 270);
        // 绘制椭圆
        canvas.drawOval(re31, paint);

        Path path5 = new Path();
        path5.moveTo(170, 340);
        path5.lineTo(230, 340);
        path5.lineTo(200, 290);
        path5.close();
        // 根据Path进行绘制,绘制三角形
        canvas.drawPath(path5, paint);

        Path path6 = new Path();
        path6.moveTo(186, 360);
        path6.lineTo(214, 360);
        path6.lineTo(230, 392);
        path6.lineTo(200, 420);
        path6.lineTo(170, 392);
        path6.close();
        // 根据Path进行绘制,绘制五角形
        canvas.drawPath(path6, paint);

        // ----------设置字符大小后绘制----------
        paint.setTextSize(24);
        paint.setShader(null);
        // 绘制7个字符串
        canvas.drawText("circle", 240, 50,paint);
        canvas.drawText("square", 240, 120,paint);
        canvas.drawText("rect", 240, 175,paint);
        canvas.drawText("RoundRect", 230, 220, paint);
        canvas.drawText("Oval", 240,260, paint);
        canvas.drawText("triangle", 240, 325,paint);
        canvas.drawText("pentagon", 240, 390,paint);


    }

paint

Matrix类

Android提供了Matrix类,使用该类提供的方法,可以对图片添加特别的效果,如旋转、缩放、倾斜等。Matrix类常用的一些方法如下:

方法 描述
setTranslate(float dx,float dy) 控制Matrix进行位移。
setSkew(float kx,float ky) 控制Matrix进行倾斜,kx、ky为X、Y方向上的比例。
setSkew(float kx,float ky,float px,float py) 控制Matrix以px、py为轴心进行倾斜,kx、ky为X、Y方向上的倾斜比例。
setRotate(float degrees) 控制Matrix进行depress角度的旋转,轴心为(0,0)。
setRotate(float degrees,float px,float py) 控制Matrix进行depress角度的旋转,轴心为(px,py)。
setScale(float sx,float sy) 设置Matrix进行缩放,sx、sy为X、Y方向上的缩放比例。
setScale(float sx,float sy,float px,float py) 设置Matrix以(px,py)为轴心进行缩放,sx、sy为X、Y方向上的缩放比例。

作者:黄俊雄
原文链接
https://blog.csdn.net/weixin_43915481/article/details/90724437