Android不但能够显示图片,而且还能够直至一些简单的二维绘图,其实对于我们常见的一些Android基本组件,如TextView、Button等都是系统绘制出来的,其绘制的操作在View类的onDraw(Canvas canvas) 方法中,每个组件都需要实现onDraw(Canvas canvas) 方法进行自定义绘制。

下面实现的是利用Canvas在屏幕随机位置绘制10个大小(边长为10-160)和颜色随机的空心五角星,先看下面的效果图:



利用中学三角函数相关知识,以最左边顶点为基准,五角星的各个拐点点坐标表示如下(草图):


XML文件 :

xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/wujiaoxing"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity">    android:layout_width="wrap_content"        android:layout_height="wrap_content" />

MainActavity.java :

package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

CanvasView.java :

import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;import java.util.Random;public class CanvasView extends View {    public CanvasView(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //自定义相关三角函数值        float sin18 = (float) Math.sin(18 * Math.PI / 180);        float cos18 = (float) Math.cos(18 * Math.PI / 180);        float sin36 = (float) Math.sin(36 * Math.PI / 180);        float cos36 = (float) Math.cos(36 * Math.PI / 180);        float sin27 = (float) Math.sin(27 * Math.PI / 180);        float cos27 = (float) Math.cos(27 * Math.PI / 180);        float sin54 = (float) Math.sin(54 * Math.PI / 180);        float cos54 = (float) Math.cos(54 * Math.PI / 180);        Paint paint = new Paint();//定义一个画笔对象        paint.setAntiAlias(true);//设置抗锯齿        paint.setStyle(Paint.Style.STROKE);//设置画笔风格        paint.setStrokeWidth(8);//设置画笔粗细        for(int i=0;i<10;i++) {            //随机颜色(rgb)生成            int red = new Random().nextInt(255)+1;            int green = new Random().nextInt(255)+1;            int blue = new Random().nextInt(255)+1;            paint.setColor(Color.rgb(red,green,blue));            //随机(x,y),a生成            float x = (float) (new Random().nextInt(800) + 40);            float y = (float) (new Random().nextInt(130)*10+100);            float a= (float) (new Random().nextInt(150)+11);            //五角星边的绘制            canvas.drawLine(x, y, x + a, y, paint);            canvas.drawLine(x + a, y, x + a + a * sin18, y - a * cos18, paint);            canvas.drawLine(x + a + a * sin18, y - a * cos18, x + a + 2 * a * sin18, y, paint);            canvas.drawLine(x + a + 2 * a * sin18, y, x + 2 * a + 2 * a * sin18, y, paint);            canvas.drawLine(x + 2 * a + 2 * a * sin18, y, (x + 2 * a + 2 * a * sin18 - a * cos36), y + a * sin36, paint);            canvas.drawLine(x + 2 * a + 2 * a * sin18 - a * cos36, y + a * sin36, x + (2 * a + 2 * a * sin18) * sin54, y + (2 * a + 2 * a * sin18) * cos54, paint);            canvas.drawLine(x + (2 * a + 2 * a * sin18) * sin54, y + (2 * a + 2 * a * sin18) * cos54, x + a * sin54 - a * sin27 + a * cos27, y + a * (cos54 + cos27 - sin27), paint);            canvas.drawLine(x + a * sin54 - a * sin27 + a * cos27, y + a * (cos54 + cos27 - sin27), x + a * sin54 - a * sin27, y + a * (cos54 + cos27), paint);            canvas.drawLine(x + a * sin54 - a * sin27, y + a * (cos54 + cos27), x + a * sin54, y + a * (cos54), paint);            canvas.drawLine(x + a * sin54, y + a * (cos54), x, y, paint);            }        }}

更多相关文章

  1. Android之ToolBar和自定义ToolBar实现沉浸式状态栏
  2. Android(安卓)进阶第二篇——性能优化
  3. 使用surfaceView制作的拍照demo
  4. Android开启网络adb调试
  5. android 遮罩层效果
  6. Android(安卓)模拟器屏幕定制(修改控制器大小)
  7. 【已解决】Android真机设备调试时LogCat的日志无法输出的问题
  8. TextView的属性详解
  9. 支持单选,多选,还可以限制选择的数量的android流式布局

随机推荐

  1. Android Frameworks系列(二) 彻底弄懂sta
  2. Android当前任务管理器不显示应用进程
  3. android 系统中的时区设置
  4. 在Android原生应用中嵌入React Native
  5. [Android]带你了解 Android 约束布局 Con
  6. OpenCV+ADT 第一个基于Android的OpenCV D
  7. Basic4android:多功能的Android应用软件快
  8. 关于Android设置控件margin无效的解决办
  9. 转 Android SDK更新后提示This version o
  10. Android base-adapter-helper 源码分析与