安卓学习 Day26:使用自定义视图绘制文本、图像与图形

一、案例演示——使用自定义视图绘制圆

1、创建安卓应用

  • 选择模板在这里插入图片描述
  • 完善项目信息
    在这里插入图片描述

2、创建自定义视图

在这里插入图片描述

  • 命名为CustomView
    在这里插入图片描述
  • 源代码
package net.zs.draw_circle;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class CustomView extends View {
    private Paint paint; // 画笔

    /**
     * 构造方法 - 初始化画笔
     */
    public CustomView(Context context) {
        super(context);
        // 创建画笔对象
        paint = new Paint();
        // 设置画笔为红色
        paint.setColor(Color.RED);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 绘制一个圆
        canvas.drawCircle(500, 500, 450, paint);
    }
}

3、主界面类

  • 源代码
package net.zs.draw_circle;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private CustomView mCustomView; // 声明自定义视图

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 实例化自定义视图
        mCustomView = new CustomView(this);
        // 将自定义视图设置为用户界面
        setContentView(mCustomView);
    }
}

4、运行程序,查看效果

在这里插入图片描述

(1)设置画笔样式

在这里插入图片描述

  • 运行结果
    在这里插入图片描述

(2)设置画笔粗细

在这里插入图片描述

  • 运行结果
    在这里插入图片描述

二、案例演示——绘制文本、图形和图像

1、创建安卓应用

  • 选择模板
    在这里插入图片描述
  • 完善项目信息
    在这里插入图片描述

2、创建自定义视图

在这里插入图片描述

  • 基础代码
package net.zs.draw_text_graph_image;

import android.content.Context;
import android.graphics.Canvas;
import android.view.View;

public class CustomView extends View {

    /**
     * 构造方法
     */
    public CustomView(Context context) {
        super(context);
    }

    /**
     * 绘制方法
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }
}

3、主界面类

  • 将自定义视图设置为用户界面
    在这里插入图片描述

4、修改自定义视图

(1)初始化

在这里插入图片描述

(2)设置画布底色

在这里插入图片描述

  • 运行效果
    在这里插入图片描述

(3)绘制直线

在这里插入图片描述

  • 运行效果
    在这里插入图片描述

(4)绘制空心多边形(三角形)

在这里插入图片描述

  • 运行效果
    在这里插入图片描述

(5)绘制实心多边形

在这里插入图片描述

  • 运行效果
    在这里插入图片描述

(6)绘制实心圆和空心圆

在这里插入图片描述

  • 运行效果
    在这里插入图片描述

(7)绘制实心矩形

在这里插入图片描述

  • 运行效果
    在这里插入图片描述

(8)绘制空心椭圆

在这里插入图片描述

  • 运行结果
    在这里插入图片描述

(9)绘制笑脸

在这里插入图片描述

  • 运行效果
    在这里插入图片描述

(10)绘制图像

  • 添加图片到drawable目录下
    在这里插入图片描述
  • 编写代码
    在这里插入图片描述
  • 运行效果
    在这里插入图片描述

5、自定义视图完整源代码

package net.zs.draw_text_graph_image;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.Toast;

public class CustomView extends View {

    private Paint paint; // 画笔
    private int screenWidth; // 屏幕宽度
    private int screenHeight; // 屏幕高度

    /**
     * 构造方法
     */
    public CustomView(Context context) {
        super(context);
        // 实例化画笔
        paint = new Paint();
        // 设置画笔放锯齿形
        paint.setAntiAlias(true);
        // 获取屏幕宽度
        screenWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth();
        // 获取屏幕高度
        screenHeight = ((Activity) context).getWindowManager().getDefaultDisplay().getHeight();
    }

    /**
     * 绘制方法
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        /* 任务1.设置画布底色 */
        // 设置画笔颜色
        paint.setColor(Color.rgb(200, 200, 240));
        // 绘制实心矩形填充整个手机屏幕
        canvas.drawRect(0, 0, screenWidth, screenHeight, paint);

        /* 任务2.绘制直线 */
        // 设置画笔颜色为红色
        paint.setColor(Color.RED);
        // 绘制横向、纵向、倾斜的直线
        canvas.drawLine(50, 50, 1000, 50, paint);
        canvas.drawLine(50, 200, 1000, 200, paint);
        canvas.drawLine(100, 0, 100, 250, paint);
        canvas.drawLine(950, 0, 950, 250, paint);
        canvas.drawLine(100, 50, 950, 200, paint);
        canvas.drawLine(100, 200, 950, 50, paint);
        // 绘制说明文本
        paint.setColor(Color.BLACK);
        paint.setTextSize(30);
        canvas.drawText("直线", 480, 35, paint);

        /* 任务3.绘制空心多边形(三角形) */
        // 设置画笔颜色为蓝色
        paint.setColor(Color.BLUE);
        // 绘制多条线段、首尾相连
        canvas.drawLine(50, 350, 370, 320, paint);
        canvas.drawLine(370, 320, 550, 500, paint);
        canvas.drawLine(550, 500, 50, 350, paint);
        // 绘制说明文本
        paint.setColor(Color.BLACK);
        paint.setTextSize(30);
        canvas.drawText("空心三角形", 250, 400, paint);

        /* 任务4.绘制实心多边形 */
        // 设置画笔颜色
        paint.setColor(Color.YELLOW);
        // 定义路径
        Path path = new Path();
        path.moveTo(600, 300); // 路径的起点
        path.lineTo(750, 250);
        path.lineTo(950, 400);
        path.lineTo(600, 600);
        path.lineTo(600, 370);
        path.close(); // 封闭路径
        // 按路径绘制图像
        canvas.drawPath(path, paint);
        // 绘制说明文本
        paint.setColor(Color.BLACK);
        paint.setTextSize(30);
        canvas.drawText("实心多边形", 650, 400, paint);

        /* 任务5.绘制实心圆和空心圆 */
        paint.setColor(Color.RED);
        canvas.drawCircle(300, 600, 100, paint);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(300, 800, 100, paint);
        // 绘制说明文本
        paint.setColor(Color.BLACK);
        paint.setTextSize(30);
        canvas.drawText("实心圆", 100, 610, paint);
        canvas.drawText("空心圆", 100, 810, paint);

        /* 任务6.绘制实心矩形 */
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawRect(new Rect(460, 650, 960, 860), paint);
        // 绘制说明文本
        paint.setColor(Color.BLACK);
        paint.setTextSize(30);
        canvas.drawText("实心矩形", 650, 750, paint);

        /* 任务7.绘制空心椭圆 */
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawArc(new RectF(50, 920, 500, 1050), 0, 360, true, paint);
        // 绘制说明文本
        paint.setColor(Color.BLACK);
        paint.setTextSize(30);
        canvas.drawText("空心椭圆", 240, 1000, paint);

        /* 任务8.绘制笑脸 */
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawArc(new RectF(550, 920, 650, 1020), 30, 300, true, paint);
        paint.setColor(Color.BLUE);
        canvas.drawArc(new RectF(700, 920, 800, 1020), 210, 300, true, paint);
        // 绘制说明文本
        paint.setColor(Color.BLACK);
        paint.setTextSize(30);
        canvas.drawText("笑脸相迎", 820, 970, paint);

        /* 任务9.绘制图像 */
        // 方法一、绘制位图
        Bitmap bitmap = BitmapFactory.decodeStream(getResources()
                .openRawResource(R.drawable.img1));
        canvas.drawBitmap(bitmap, 50, 1100, paint);
        // 方法二、利用可绘制对象
        Drawable drawable = getResources().getDrawable(R.drawable.img1);
        drawable.setBounds(new Rect(870, 1200, 1160, 1400));
        drawable.draw(canvas);
    }
}

三、案例演示——View动画(闪烁满天星)

1、创建安卓应用

  • 选择模板
    在这里插入图片描述
  • 完善项目信息
    在这里插入图片描述

2、添加月亮图片

在这里插入图片描述

3、创建自定义视图

在这里插入图片描述

  • 源代码
package net.zs.twinkling_stars;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.view.View;

public class CustomView extends View {

    private Paint paint; // 画笔
    private int screenWidth; // 屏幕宽度
    private int screenHeight; // 屏幕高度
    private int count; // 刷屏次数

    /**
     * 构造方法
     */
    public CustomView(Context context) {
        super(context);
        // 实例化画笔
        paint = new Paint();
        // 获取屏幕宽度
        screenWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth();
        // 获取屏幕高度
        screenHeight = ((Activity) context).getWindowManager().getDefaultDisplay().getHeight();
    }

    /**
     * 绘制方法
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        /* 将画布底色设置为黑色 —— 夜空 */
        paint.setColor(Color.BLACK);
        canvas.drawRect(0, 0, screenWidth, screenHeight, paint);

        // 确保count只能取0、1、2
        count = ++count % 3;

        // 根据刷屏次数来设置画笔颜色
        switch (count) {
            case 0:
                paint.setColor(Color.GREEN); // 设置为绿色画笔
                break;
            case 1:
                paint.setColor(Color.WHITE); // 设置为白色画笔
                break;
            case 2:
                paint.setColor(Color.YELLOW); // 设置为黄色画笔
                break;
        }

        // 绘制月亮位图
        Drawable drawable = getResources().getDrawable(R.drawable.moon);
        drawable.setBounds(220, 90, 380, 250);
        drawable.draw(canvas);

        // 绘制星星
        paint.setTextSize(20);
        for (int i = 0; i < 100; i++) {
            canvas.drawText("★", (int)(Math.random() * screenWidth),
                    (int) (Math.random() * screenHeight), paint);
        }
    }
}

4、主界面类

  • 源代码
package net.zs.twinkling_stars;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

    private CustomView mCustomView; // 自定义视图
    private Timer timer; // 定时器
    private TimerTask task; // 定时器任务

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 实例化自定义视图
        mCustomView = new CustomView(this);
        // 将自定义视图设置为用户界面
        setContentView(mCustomView);

        // 创建定时器
        timer = new Timer();
        // 创建定时器任务
        task = new TimerTask() {
            @Override
            public void run() {
                // 刷新自定义视图
                mCustomView.postInvalidate();
            }
        };
        // 对定时器任务进行调度
        timer.schedule(task, 0, 100);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消定时器任务
        timer.cancel();
    }
}

5、运行程序,查看效果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值