Android畫筆 --- 反復(fù)畫圓盤

效果展示:

效果展示1
效果展示2
效果展示3

代碼:

創(chuàng)建TestView類:
package swu.twj.a13_drawview;

import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

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

/**
 * 餅狀圖
 */
public class TestView extends View {
    int startAngle = 0;
    int angle;//每一次增長(zhǎng)之后的值
    int speed = 10;//增長(zhǎng)速度

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

    public TestView(Context context, AttributeSet attrs) {
        super(context, attrs);

        setBackgroundColor(Color.GRAY);
    }

    /**
     * 當(dāng)繼承于ViewGroup的時(shí)候
     * @param widthMeasureSpec 父控件預(yù)測(cè)的這個(gè)控件的最大寬度
     * @param heightMeasureSpec 父控件預(yù)測(cè)的這個(gè)控件的最大高度
     */
    @Override
    //測(cè)量:設(shè)置視圖控件的具體尺寸
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        //固定的尺寸 - 自己設(shè)定寬高
        //setMeasuredDimension(100,100);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        /*
        //創(chuàng)建定時(shí)器 每隔0.3s畫一次
        final Timer t = new Timer();
        t.schedule(new TimerTask() {
            @Override
            public void run() {
                angle += speed;
                //控制最大值
                if (angle > 360){
                    t.cancel();//關(guān)閉定時(shí)器
                }
                invalidate();//通知系統(tǒng)調(diào)用onDraw
                //postInvalidate();//子線程里面
            }
        },0,300);
        */

        //屬性動(dòng)畫
        //ObjectAnimator
        //ValueAnimator  監(jiān)聽動(dòng)畫過程中某個(gè)值的改變過程
        //angle  0 - 360
        ValueAnimator va = ValueAnimator.ofInt(0,360);
        va.setDuration(1000);
        va.setRepeatCount(ValueAnimator.INFINITE);
        va.setRepeatMode(ValueAnimator.REVERSE);

        //設(shè)置監(jiān)聽器 監(jiān)聽值的變化
        va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                //獲取某一刻的值
                angle = (int)valueAnimator.getAnimatedValue();

                //刷新
                invalidate();
            }
        });
        //啟動(dòng)
        va.start();
    }

    /**
     * 如果自定義的視圖
     * 形狀無規(guī)則
     * 用特定的方式顯示內(nèi)容
     * 完成特定功能
     * @param canvas 默認(rèn)提供的一個(gè)畫布
     * 將需要的內(nèi)容畫到畫布上 統(tǒng)一 渲染到界面上GPU
     * 缺點(diǎn):如果頻繁繪制 內(nèi)存吃緊
     *
     * 能夠使用系統(tǒng)的就不要自己繪制
     */
    @SuppressLint("DrawAllocation")
    @Override
    protected void onDraw(Canvas canvas) {

        //畫一條線
        //1.準(zhǔn)備畫筆
        Paint mPaint = new Paint();
        mPaint.setColor(Color.BLACK);//畫筆顏色
        mPaint.setStrokeWidth(20);//畫筆的粗細(xì)
        mPaint.setAntiAlias(true);//抗鋸齒
        //mPaint.setStyle(Paint.Style.STROKE);//設(shè)置空心
        mPaint.setStyle(Paint.Style.FILL);//設(shè)置實(shí)心

        //2.畫線
        //canvas.drawLine(100,100,800,800,mPaint);

        //3.畫圓
        //canvas.drawArc(50,100,350,400,0,270,true,mPaint);

        Timer t = new Timer();
        t.schedule(new TimerTask() {
            @Override
            public void run() {
                angle += speed;
                //控制最大值
                if (angle > 360){
                    angle = 360;
                }
                invalidate();
            }
        },0,500);
        drawPieChart(canvas,Color.MAGENTA,(float)(angle/360.0));
        //drawPieChart(canvas,Color.BLUE,(float)(1/4.0));
        //drawPieChart(canvas,Color.GREEN,(float)(1/4.0));
        //drawPieChart(canvas,Color.RED,(float)(1/4.0));
    }

    //畫餅狀圖
    private void drawPieChart(Canvas canvas,int color,float rate){
        //畫筆
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(color);

        //畫扇形
        int endAngle = (int)(360*rate);
        canvas.drawArc(50,100,550,600,0,endAngle,true,paint);
        startAngle += endAngle;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN){
            //點(diǎn)擊屏幕 畫一點(diǎn)
            angle += speed;

            //控制最大值
            if (angle > 360){
                angle = 360;
            }

            //告訴系統(tǒng)調(diào)用onDraw方法實(shí)現(xiàn)繪制
            invalidate();
        }
        return true;
    }
}
xml文件配置:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <swu.twj.a13_drawview.TestView
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>

</RelativeLayout>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子包帚,更是在濱河造成了極大的恐慌,老刑警劉巖镊叁,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異走触,居然都是意外死亡晦譬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門饺汹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痰催,你說我怎么就攤上這事兜辞∮疲” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵逸吵,是天一觀的道長(zhǎng)凶硅。 經(jīng)常有香客問我,道長(zhǎng)扫皱,這世上最難降的妖魔是什么足绅? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮韩脑,結(jié)果婚禮上氢妈,老公的妹妹穿的比我還像新娘。我一直安慰自己段多,他們只是感情好首量,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著进苍,像睡著了一般加缘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上觉啊,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天拣宏,我揣著相機(jī)與錄音,去河邊找鬼杠人。 笑死勋乾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搜吧。 我是一名探鬼主播市俊,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼滤奈!你這毒婦竟也來了摆昧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤蜒程,失蹤者是張志新(化名)和其女友劉穎绅你,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昭躺,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忌锯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了领炫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偶垮。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出似舵,到底是詐尸還是另有隱情脚猾,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布砚哗,位于F島的核電站龙助,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛛芥。R本人自食惡果不足惜提鸟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仅淑。 院中可真熱鬧称勋,春花似錦、人聲如沸漓糙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昆禽。三九已至蝗蛙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間醉鳖,已是汗流浹背捡硅。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盗棵,地道東北人壮韭。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纹因,于是被迫代替她去往敵國(guó)和親喷屋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,098評(píng)論 1 32
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 瞭恰? MyBatis 是支持定制化 SQL屯曹、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,518評(píng)論 0 4
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,810評(píng)論 0 11
  • 清晨無事,上班路中掃蕩了一下朋友圈惊畏,被《寒門……》一文所狩獵恶耽,不得不說作者是個(gè)標(biāo)題黨,深諳現(xiàn)代社會(huì)的焦慮和好奇颜启,身...
    敢說真話的妖精閱讀 348評(píng)論 2 8
  • 陌上新桑夢(mèng)長(zhǎng)安缰盏,紅塵湮沒江湖遠(yuǎn)涌萤。 濁酒一壺笙簫寒淹遵,緣分了斷終成憾。 我是本期編輯:o寂燃o(jì) 武俠江湖專題除了收錄有...
    o綰卿o閱讀 449評(píng)論 30 17