利用Canvas實現繪圖功能(繪製五角星)

要求

利用Canvas編程實現在屏幕上隨機位置繪製10個隨機大小(邊長爲20-100dp)的五角星。

過程

一、繪製五角星

首先要解決的問題就是繪製五角星,有了五角星 才能談其他的,繪製五角星有很多種辦法,可以利用圓,可以用線段旋轉等等。這裏用簡單的方式即用canvas實現線段的繪製,並通過線段的選轉來實現五角星的繪製,話不多說 上代碼:

canvas.drawLine(1, 5,7, 5, paint);
canvas.translate(1, 5);
canvas.rotate(36);
canvas.drawLine(0, 0, 6 , 0, paint);
canvas.translate(6 , 0);
canvas.rotate(36);
canvas.drawLine(0, 0, -6 , 0, paint);
canvas.translate(-6 , 0);
canvas.rotate(36);
canvas.drawLine(0, 0, 6 , 0, paint);
canvas.translate(6 , 0);
canvas.rotate(36);
canvas.drawLine(0, 0, -6 , 0, paint);

這樣就可以繪製成一個五角星了。然而,這個五角星是固定長度,固定位置的。

二、生成隨機數

其次,要實現兩個隨機 。隨機位置、隨即大小。這個時候 就可以用ramdom來實現隨機數的生成,從而改變五角星的大小和位置。生成隨機數一般如下:

int x = new Random().nextInt(100);

但是,題目中有要求,五角星大小爲20-100dp(懵懵懂懂的我就認爲,生成的隨機數爲20-100)代碼如下:

int min=20;
int max=100;
Random random = new Random();
int x = random.nextInt(max)%(max-min+1) + min;

三、利用循環,生成10個五角星

當解決了以上兩個問題之後,接下來要做的就是實現10個五角星的生成,這一步也是最簡單的一步,可以直接利用for循環,while循環,或者do……while循環來實現,這裏用的for循環:

for(int i =0;i<10;i++){循環體……}

四、完整代碼

activity_main.xml,這裏要注意組件的應用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

        <com.example.myexperiment5515.CanvasView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity.java

package com.example.myexperiment5515;

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實現五角星繪製的主要代碼在裏面

package com.example.myexperiment5515;

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

import java.util.Random;

import static java.lang.Math.sin;

public class CanvasView extends View {

    public CanvasView(Context context, AttributeSet attrs) {
        super(context);
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for(int i =0;i<10;i++){
            int min=20;
            int max=100;
            Random random = new Random();
            int x = random.nextInt(max)%(max-min+1) + min;

            Paint paint = new Paint();//定義一個畫筆對象
            paint.setAntiAlias(true);//設置抗鋸齒
            paint.setStyle(Paint.Style.STROKE);//設置畫筆風格
            paint.setStrokeWidth(5);//設置畫筆粗細
            paint.setColor(Color.GREEN);//設置顏色
            paint.setTextSize(40);//設置文字顯示大小
            //繪製五角星
            canvas.drawLine(2 * x, 5 * x, 8 * x, 5 * x, paint);
            canvas.translate(2 * x, 5 * x);
            canvas.rotate(36);
            canvas.drawLine(0, 0, 6 * x, 0, paint);
            canvas.translate(6 * x, 0);
            canvas.rotate(36);
            canvas.drawLine(0, 0, -6 * x, 0, paint);
            canvas.translate(-6 * x, 0);
            canvas.rotate(36);
            canvas.drawLine(0, 0, 6 * x, 0, paint);
            canvas.translate(6 * x, 0);
            canvas.rotate(36);
            canvas.drawLine(0, 0, -6 * x, 0, paint);
        }
    }
}

存在的問題

這樣做完以後,五角星出來了,也隨機生成了。但是,生成的五角星不一定在屏幕內 如下圖:
在這裏插入圖片描述
在這裏插入圖片描述

在這裏,小白跪求路過的大佬直到一下,如何能讓它不往屏幕外邊跑;
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章