<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_draw_circle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="画圆"/>
<Button
android:id="@+id/btn_draw_star"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="画五角星"/>
<Button
android:id="@+id/btn_translate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="平移变换"/>
<ImageView
android:id="@+id/iv_translate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="matrix"
android:src="@mipmap/custom1"/>
<Button
android:id="@+id/btn_translate_scale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="平移和缩放变换"/>
<ImageView
android:id="@+id/iv_translate_scale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="matrix"
android:src="@mipmap/custom2"/>
<Button
android:id="@+id/btn_skew_rotate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="错切和旋转变换"/>
<ImageView
android:id="@+id/iv_skew_rotate"
android:layout_width="match_parent"
android:layout_height="100dp"
android:src="@mipmap/custom3"/>
<Button
android:id="@+id/btn_bitmap_shader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Shader渲染"/>
<ImageView
android:id="@+id/iv_bitmap_shader"
android:layout_width="match_parent"
android:layout_height="100dp"
android:src="@mipmap/custom4"/>
<Button
android:id="@+id/btn_line_shader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="渐变填充"/>
<ImageView
android:id="@+id/iv_line_shader"
android:layout_width="match_parent"
android:layout_height="100dp"/>
<ImageView
android:id="@+id/iv_line_shader1"
android:layout_width="match_parent"
android:layout_height="100dp"/>
</LinearLayout>
</ScrollView>
```java
package net.onest.paintapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Shader;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private Button btnPaint;
private Button btnPaintStar;
private ImageView iv;
private Button btnTranslate;
private ImageView ivTranslate;
private Button btnTranslateScale;
private ImageView ivTranslateScale;
private Button btnSkewRotate;
private ImageView ivSkewRotate;
private Button btnShader;
private ImageView ivShader;
private Button btnLineShader;
private ImageView ivLineShader;
private ImageView ivLineShader1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
setListeners();
}
private void drawStar(){
//创建bitmap对象
Bitmap bitmap=Bitmap.createBitmap(1000,1000,Bitmap.Config.ARGB_8888);
//创建canvas对象
Canvas canvas=new Canvas(bitmap);
//创建Paint对象
Paint paint=new Paint();
paint.setColor(getResources().getColor(R.color.colorYellow));
paint.setARGB(200,100,58,180);
Path path=new Path();
path.moveTo(0,250);
path.lineTo(1000,250);
path.lineTo(0,1000);
path.lineTo(500,0);
path.lineTo(1000,1000);
path.lineTo(0,250);
canvas.drawPath(path,paint);
iv.setImageBitmap(bitmap);
}
private void drawCircle(){
//创建Bitmap对象
Bitmap bitmap=Bitmap.createBitmap(800,800,Bitmap.Config.ARGB_8888);
//创建Canvas对象
Canvas canvas=new Canvas(bitmap);
//创建Paint对象
Paint paint=new Paint();
paint.setStrokeWidth(5);
paint.setColor(Color.RED);
paint.setColor(getResources().getColor(R.color.colorPrimary));
paint.setARGB(200,100,58,180);
//不填充颜色(空心)
paint.setStyle(Paint.Style.STROKE);
//使用Bitmap对象生成图像
canvas.drawCircle(100,100,100,paint);
//显示
iv.setImageBitmap(bitmap);
}
private void setListeners() {
MyListener myListener=new MyListener();
btnPaint.setOnClickListener(myListener);
btnPaintStar.setOnClickListener(myListener);
btnTranslate.setOnClickListener(myListener);
btnTranslateScale.setOnClickListener(myListener);
btnSkewRotate.setOnClickListener(myListener);
btnShader.setOnClickListener(myListener);
btnLineShader.setOnClickListener(myListener);
}
class MyListener implements View.OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_draw_circle:
drawCircle();
break;
case R.id.btn_draw_star:
drawStar();
break;
case R.id.btn_translate://做图像的平移变换
translateImageview();
break;
case R.id.btn_translate_scale://对图像控件进行平移、缩放变换
translateScaleImageView();
break;
case R.id.btn_skew_rotate://对图像进行错切和旋转
skewRotateImage();
break;
case R.id.btn_bitmap_shader:
bitmapShader();
break;
case R.id.btn_line_shader://渐变填充效果
lineShader();
break;
}
}
}
private void lineShader() {//线性渐变填充
//创建空白的bitmap对象
Bitmap bitmap=Bitmap.createBitmap(800,800, Bitmap.Config.ARGB_8888);
//创建canvas对象
Canvas canvas=new Canvas(bitmap);
//创建paint对象
Paint paint=new Paint();
//设置线宽、线性渐变的shader对象、渐变填充样式
paint.setStrokeWidth(50);
Shader shader=new LinearGradient(0,0,//渐变起始坐标
800,400,//渐变终止坐标
Color.RED,Color.BLUE,//渐变色
Shader.TileMode.REPEAT);
paint.setShader(shader);
//canvas对象画图(画直线)
canvas.drawLine(0,0,800,400,paint);
//改变shader样式
Bitmap bitmap1=BitmapFactory.decodeResource(getResources(),R.mipmap.custom1);
BitmapShader shader1=new BitmapShader(bitmap1,Shader.TileMode.MIRROR,Shader.TileMode.MIRROR);
paint.setShader(shader1);
paint.setStrokeWidth(200);
canvas.drawLine(0,400,800,400,paint);
//显示
ivLineShader.setImageBitmap(bitmap);
}
private void bitmapShader() {//应用图像渲染
//获取作为底图的图像对象
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.mipmap.custom4);
//创建空白bitmap对象
Bitmap bitmapNew=Bitmap.createBitmap(800,800, Bitmap.Config.ARGB_8888);
//创建canvas对象
Canvas canvas=new Canvas(bitmapNew);
//创建paint对象,设置文本大小、颜色
Paint paint=new Paint();
paint.setTextSize(50);
//设置填充效果,创建shader对象,给paint对象
Shader shader=new BitmapShader(bitmap,
Shader.TileMode.REPEAT,//水平填充方式
Shader.TileMode.REPEAT);//树脂填充方式
//给paint设置填充效果
paint.setShader(shader);
//往空白图想上写字(x、y:字的起始位置)
canvas.drawText("神奇的艺术字效果",50,50,paint);
//将生成的图像设置给view
ivShader.setImageBitmap(bitmapNew);
}
private void skewRotateImage() {
//获取应用变换的图像对象
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.mipmap.custom3);
//不能对原有的图像进行变换(原有图像相当于一个常量)
//创建一个空的bitmap,存储获得的图像
Bitmap bitmapCopy=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888);
//创建matrix
Matrix matrix=new Matrix();
//给matrix设置错切和旋转变换
matrix.setSkew(0.2f,-1.1f);
//设置图像以其中心为轴逆时针进行旋转
matrix.postRotate(-45);
matrix.postTranslate(0,50);
//去除锯齿,防止图像在进行变换后失真
Paint paint=new Paint();
paint.setAntiAlias(true);
//创建canvas对象
Canvas canvas=new Canvas(bitmapCopy);
//应用给图像变换(绘制图像的同时,应用变换)
canvas.drawBitmap(bitmap,matrix,paint);
//将变换后的图像显示在图像控件中
ivSkewRotate.setImageBitmap(bitmapCopy);
}
private void translateScaleImageView() {
Matrix matrix=new Matrix();
matrix.setTranslate(400,0);
matrix.postScale(2,0.5f);
ivTranslateScale.setImageMatrix(matrix);
}
private void translateImageview() {
//创建matrix对象
Matrix matrix=new Matrix();
//设置平移效果
matrix.setTranslate(300,0);
//给目标对象应用matrix设置的效果
ivTranslate.setImageMatrix(matrix);
}
private void findViews() {
btnPaint=findViewById(R.id.btn_draw_circle);
btnPaintStar=findViewById(R.id.btn_draw_star);
iv=findViewById(R.id.iv);
btnTranslate=findViewById(R.id.btn_translate);
ivTranslate=findViewById(R.id.iv_translate);
btnTranslateScale=findViewById(R.id.btn_translate_scale);
ivTranslateScale=findViewById(R.id.iv_translate_scale);
btnSkewRotate=findViewById(R.id.btn_skew_rotate);
ivSkewRotate=findViewById(R.id.iv_skew_rotate);
btnShader=findViewById(R.id.btn_bitmap_shader);
ivShader=findViewById(R.id.iv_bitmap_shader);
btnLineShader=findViewById(R.id.btn_line_shader);
ivLineShader=findViewById(R.id.iv_line_shader);
ivLineShader1=findViewById(R.id.iv_line_shader1);
}
}