欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

自定義view視圖之Canvas+Paint圖形繪制

 更新時(shí)間:2023年04月04日 09:02:42   作者:小白的成長之路  
這篇文章主要介紹了自定義view視圖之Canvas+Paint圖形繪制,我們開發(fā)自定義view的時(shí)候,就要繪制自己心儀的圖形,這個(gè)時(shí)候我們就要能夠熟練的運(yùn)用我們的繪圖知識,需要的朋友可以參考下

我們開發(fā)自定義view的時(shí)候,就要繪制自己心儀的圖形,這個(gè)時(shí)候我們就要能夠熟練的運(yùn)用我們的繪圖知識,這里我們看一下如何實(shí)現(xiàn)

一、繪圖都需要那些相關(guān)知識

1、我們平常畫畫一樣,我們需要一張畫布(Canvas)

2、我們平常畫畫一樣,我們需要一直畫筆(Paint)

二、我們先來了解下Canvas

Canvas代表了“依附”于指定View的畫布,他提供了很多形狀的繪制方法,而Paint也提供了一些方法,如下 Canvas常用方法

這里寫圖片描述

Paint常用方法

這里寫圖片描述

還有幾個(gè)效果方法

rotate(float degrees,float px,float py):對Canvas執(zhí)行旋轉(zhuǎn)變換。
scale(float sx,float sy,float px,float py):對Canvas進(jìn)行縮放變換。
skew(float sx,float sy):對Canvas執(zhí)行傾斜變換。
translate(float dx,float dy):移動Canvas。向右移動dx距離(dx為負(fù)數(shù)即向左):向下移動dy(正數(shù)為下移動,負(fù)數(shù)為上移動)

三、那我們?nèi)绾蝸硎褂眠@些方法進(jìn)行繪制呢?

1、我們需要創(chuàng)建一個(gè)類繼承view

重寫構(gòu)造方法,和onDraw()方法,而我們就需要在此方法中進(jìn)行繪制

(1)首先定義一個(gè)畫筆對象和一個(gè)畫布的顏色

paint = new Paint(); 
canvas.drawColor(Color.WHITE);

(2)我們需要給我的畫筆對象設(shè)置一些屬性,比如畫筆的大小、顏色等!

  //我們給畫筆設(shè)置一些屬性,

        paint.setAntiAlias(true);//取消鋸齒
        paint.setColor(Color.BLUE);//畫筆的顏色
        paint.setStyle(Paint.Style.STROKE);//畫筆的粗細(xì)
        paint.setStrokeWidth(4);//畫筆的寬度
        int viewWidth = this.getWidth();//獲取系統(tǒng)屏幕


//-------------------------------------------------------------------------
        /*
        * 給我們繪制的圖形進(jìn)行填充,看效果打開代碼即可
        * */
//        paint.setStyle(Paint.Style.FILL);//充滿填充
//        paint.setColor(Color.RED);//填充顏色

//-------------------------------------------------------------------------
        /*
        * 設(shè)置圖形漸變,看效果打開代碼即可
        * */
//        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);
//        //設(shè)置陰影
//        paint.setShadowLayer(25 , 20 , 20 , Color.GRAY);

那么如何進(jìn)行繪制,其實(shí)很簡單,直接調(diào)用上面表格中的方法即可,例如繪制圓形,只有一句

  /*
        * 繪制圓形
        * drawCirecle(cx,xy,radius,paint)
        * cx: viewWidth / 10 + 10表示占屏幕的十分之一,并且左偏移10dp
        * xy: viewWidth / 10 + 10表示占屏幕的十分之一,并且上偏移10dp
        * radius: 半徑
        * paint:畫筆
        * */
        canvas.drawCircle(viewWidth / 10 + 10, viewWidth / 10 + 10, viewWidth / 10, paint);

全部代碼如下

package tester.ermu.com.canvasdemo;

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

/**
 * Created by ENZ on 2016/11/17.
 * 1、我們不管繪制什么圖形,都需要兩個(gè)工具,就是畫筆和畫布。
 * 2、canvas是畫布
 * 3、Paint是畫筆
 */

public class CanvasText extends View {
    //聲明一個(gè)畫筆的對象
    private Paint paint;

    public CanvasText(Context context) {
        super(context);
    }

    //如果這個(gè)不引用,會報(bào)錯(cuò)哦!自定義View,必須在構(gòu)造函數(shù)有AttributeSet attrs這個(gè)參數(shù),便于自定義屬性的引用。
    public CanvasText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    //我們重寫onDraw()方法
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //聲明一個(gè)畫筆,設(shè)置一個(gè)白色的畫布,這樣筆和畫布都有了
        paint = new Paint();
        canvas.drawColor(Color.WHITE);

        //我們給畫筆設(shè)置一些屬性,

        paint.setAntiAlias(true);//取消鋸齒
        paint.setColor(Color.BLUE);//畫筆的顏色
        paint.setStyle(Paint.Style.STROKE);//畫筆的粗細(xì)
        paint.setStrokeWidth(4);//畫筆的寬度
        int viewWidth = this.getWidth();//獲取控件屏幕


//-------------------------------------------------------------------------
        /*
        * 給我們繪制的圖形進(jìn)行填充,看效果打開代碼即可
        * */
//        paint.setStyle(Paint.Style.FILL);//充滿填充
//        paint.setColor(Color.RED);//填充顏色

//-------------------------------------------------------------------------
        /*
        * 設(shè)置圖形漸變,看效果打開代碼即可
        * */
//        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);
//        //設(shè)置陰影
//        paint.setShadowLayer(25 , 20 , 20 , Color.GRAY);

//-------------------------------------------------------------------------
        /*
        * 繪制圓形
        * drawCirecle(cx,xy,radius,paint)
        * radius: 半徑
        * paint:畫筆
        * */
        canvas.drawCircle(viewWidth / 10 + 10, viewWidth / 10 + 10, viewWidth / 10, paint);
//-------------------------------------------------------------------------
        /*
        * 繪制正方形
        * drawRect(左,上,右,下,畫筆)
        * */
        canvas.drawRect(10 , viewWidth / 5 + 20 , viewWidth / 5 + 10,viewWidth * 2 / 5 + 20 , paint);

//-------------------------------------------------------------------------
        /*
        * 繪制矩形
        * drawRect(左,上,右,下,畫筆)
        * */
        canvas.drawRect(10, viewWidth * 2 / 5 + 30, viewWidth / 5 + 10, viewWidth / 2 + 30, paint);

//-------------------------------------------------------------------------

        /*
        * 繪制橢圓
        *1、我們先來一個(gè)矩形,
        *
        *
        * */
        RectF re1 = new RectF(10, viewWidth / 2 + 40, 10 + viewWidth / 5 ,viewWidth * 3 / 5 + 40);
        // 繪制圓角矩形
        canvas.drawRoundRect(re1, 15, 15, paint);

//-------------------------------------------------------------------------
        /*
        * 定義一個(gè)Path對象,封閉成一個(gè)三角形
        * 三角形的繪制,和上面不一樣,這里面需要有3個(gè)坐標(biāo)點(diǎn)
        * 連接三個(gè)坐標(biāo)點(diǎn)即可(左、右、上下)
        * */

        Path path1 = new Path();
        path1.moveTo(10, viewWidth * 9 / 10 + 60);
        path1.lineTo(viewWidth / 5 + 10, viewWidth * 9 / 10 + 60);
        path1.lineTo(viewWidth / 10 + 10, viewWidth * 7 / 10 + 60);
        path1.close();
        canvas.drawPath(path1, paint);
//-------------------------------------------------------------------------
        /*
        * 定義一個(gè)Path對象,封閉成一個(gè)五角形
        * 連接五個(gè)坐標(biāo)點(diǎn)即可(順時(shí)針開始繪制點(diǎn))
        * */

        Path path2 = new Path();
        path2.moveTo(10 + viewWidth / 15, viewWidth * 9 / 10 + 70);
        path2.lineTo(10 + viewWidth * 2 / 15, viewWidth * 9 / 10 + 70);
        path2.lineTo(10 + viewWidth / 5, viewWidth + 70);
        path2.lineTo(10 + viewWidth / 10, viewWidth * 11/10 + 70);
        path2.lineTo(10 , viewWidth + 70);
        path2.close();
        canvas.drawPath(path2, paint);

//-------------------------------------------------------------------------
        /*
        * 文字的添加
        *  paint.setTextSize(textSize);//設(shè)置字體大小
        *  paint.setTypeface(typeface);//設(shè)置字體類型搜索
        *  canvas.drawText(text, x, y, paint);//使用畫筆paint
        * */
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.RED);
        paint.setStrokeWidth(2);
        paint.setTextSize(36);
        canvas.drawText("圓形", 60 + viewWidth * 3 / 5, viewWidth / 10 + 10, paint);
        canvas.drawText("正方形", 60 + viewWidth * 3 / 5, viewWidth * 3 / 10 + 20, paint);
        canvas.drawText("長方形", 60 + viewWidth * 3 / 5, viewWidth * 1 / 2 + 20, paint);
        canvas.drawText("圓角矩形" , 60 + viewWidth * 3 / 5, viewWidth * 3 / 5 + 30, paint);
        canvas.drawText("橢圓", 60 + viewWidth * 3 / 5, viewWidth * 7 / 10 + 30, paint);
        canvas.drawText("三角", 60 + viewWidth * 3 / 5, viewWidth * 9 / 10 + 30, paint);
        canvas.drawText("五角星", 60 + viewWidth * 3 / 5, viewWidth * 11 / 10 + 30, paint);
    }
}

四、我們在布局中引用我們自定義的類

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <tester.ermu.com.canvasdemo.CanvasText
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       />
</LinearLayout>

五、運(yùn)行效果

無填充效果

這里寫圖片描述

填充效果

這里寫圖片描述

漸變效果

這里寫圖片描述

到此這篇關(guān)于自定義view視圖之Canvas+Paint圖形繪制的文章就介紹到這了,更多相關(guān)Canvas+Paint圖形繪制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Kotlin?協(xié)程的取消機(jī)制詳細(xì)解讀

    Kotlin?協(xié)程的取消機(jī)制詳細(xì)解讀

    這篇文章主要為大家介紹了Kotlin?協(xié)程的取消機(jī)制詳細(xì)解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 使用Android Studio Gradle實(shí)現(xiàn)友盟多渠道打包

    使用Android Studio Gradle實(shí)現(xiàn)友盟多渠道打包

    這篇文章主要介紹了使用Android Studio Gradle實(shí)現(xiàn)友盟多渠道打包,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android中post請求傳遞json數(shù)據(jù)給服務(wù)端的實(shí)例

    Android中post請求傳遞json數(shù)據(jù)給服務(wù)端的實(shí)例

    下面小編就為大家分享一篇Android中post請求傳遞json數(shù)據(jù)給服務(wù)端的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Android開發(fā)控制ScrollView滑動速度的方法

    Android開發(fā)控制ScrollView滑動速度的方法

    這篇文章主要介紹了Android開發(fā)控制ScrollView滑動速度的方法,結(jié)合實(shí)例形式分析了Android編程中ScrollView滑動事件相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • Flutter中數(shù)據(jù)存儲的四種方式小結(jié)

    Flutter中數(shù)據(jù)存儲的四種方式小結(jié)

    在 Flutter 中,存儲是指用于本地和遠(yuǎn)程存儲和管理數(shù)據(jù)的機(jī)制,本給大家介紹了Flutter中不同存儲選項(xiàng)的概述和示例,通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-11-11
  • android開發(fā)框架afinal使用方法小結(jié)

    android開發(fā)框架afinal使用方法小結(jié)

    這篇文章主要為大家詳細(xì)總結(jié)了android開發(fā)框架afinal使用方法,注解功能、文件上傳下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android中手機(jī)錄屏并轉(zhuǎn)換GIF的兩種方式

    Android中手機(jī)錄屏并轉(zhuǎn)換GIF的兩種方式

    本文主要介紹了android中手機(jī)錄屏并轉(zhuǎn)換GIF的兩種方式,具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • Android實(shí)現(xiàn)閃屏效果

    Android實(shí)現(xiàn)閃屏效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)閃屏效果,實(shí)現(xiàn)“一閃而過”效果進(jìn)入頁面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android實(shí)現(xiàn)excel/pdf/word/odt/圖片相互轉(zhuǎn)換

    Android實(shí)現(xiàn)excel/pdf/word/odt/圖片相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了Android如何實(shí)現(xiàn)excel/pdf/word/odt/圖片之間的相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-04-04
  • android讀寫中文如何避免亂碼詳解

    android讀寫中文如何避免亂碼詳解

    這篇文章主要介紹了android讀寫中文如何避免亂碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-04-04

最新評論