Android自定義View實現(xiàn)八卦圖效果

最近研究了下自定義View,就自己寫了個Demo練練手复斥。網(wǎng)上有很多講自定義View實現(xiàn)的文章营密,我這里就不說了,直接上Demo目锭。


先看下效果

八卦圖.png

實現(xiàn)思路

1评汰、左右兩邊分別畫一個背景為黑色和白色的半圓。
2痢虹、上下畫兩個小圓
3被去、最后畫魚眼

實現(xiàn)步驟

1、設置自定義屬性

     
    //這里我們設置了兩個屬性奖唯,一個是背景色惨缆,另一個是八卦的半徑
    <declare-styleable name="BaGuaView">
        <attr name="bgColor" format="color"></attr>
        <attr name="radius" format="integer"></attr>
    </declare-styleable>

2、定義畫筆和其他屬性

    /**
     * 黑色畫筆
     */
    private Paint mBlackPaint;

    /**
     * 白色畫筆
     */
    private Paint mWhitePaint;

    /**
     * 背景顏色
     */
    private int mBgColor;

    /**
     * 八卦半徑
     */
    private int mRadius;

3丰捷、初始化畫筆

    public BaGuaView(Context context) {
        this(context, null);
    }

    public BaGuaView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BaGuaView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.BaGuaView, defStyleAttr, 0);

        try {
            mBgColor = array.getColor(R.styleable.BaGuaView_bgColor, Color.GRAY);//默認為棕色
            mRadius = array.getInteger(R.styleable.BaGuaView_radius, 100);//默認半徑為100
        } finally {
            array.recycle();
        }

        mWhitePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mBlackPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

        mWhitePaint.setColor(Color.WHITE);
        mBlackPaint.setColor(Color.BLACK);
    }

4坯墨、畫兩個半圓

    //將Canvas坐標移動到畫布中心
    canvas.translate(getWidth() / 2, getHeight() / 2);
    //設置背景色
    canvas.drawColor(mBgColor);

    //設置繪制區(qū)域,這里是以畫布中心為坐標原點
    RectF rectF = new RectF(-mRadius, -mRadius, mRadius, mRadius);
    //畫左邊黑色半圓
    canvas.drawArc(rectF, 90, 180, true, mBlackPaint);
    //畫右邊白色半圓
    canvas.drawArc(rectF, -90, 180, true, mWhitePaint);

效果如下


八卦1.png

5病往、繪制兩個魚頭

    //圓心分別上下移動半徑的一半捣染,半徑為原來的一半
    canvas.drawCircle(0, -mRadius / 2, mRadius / 2, mBlackPaint);
    canvas.drawCircle(0, mRadius / 2, mRadius / 2, mWhitePaint);

效果如下

八卦2.png

6、繪制魚眼

    //畫兩個更小的圓荣恐,還以魚頭的圓心為圓心液斜,半徑為原半徑的1/6,這個值可以自己設定
    canvas.drawCircle(0, -mRadius / 2, mRadius / 6, mWhitePaint);
    canvas.drawCircle(0, mRadius / 2, mRadius / 6, mBlackPaint);

效果如下

八卦3.png

7累贤、讓八卦轉動起來

    //設置旋轉角度
    private float degrees = 0;

    //設置完背景色之后讓Canvas旋轉
    degrees = degrees + 3;
    canvas.rotate(degrees);
    
    //在八卦繪制完成之后每隔15ms刷新繪制,實現(xiàn)旋轉效果
    postInvalidateDelayed(15);

這樣我們就通過自定義View實現(xiàn)了八卦圖的功能叠穆。是不是很酷炫呀。

完整代碼

public class BaGuaView extends View {

    /**
     * 黑色畫筆
     */
    private Paint mBlackPaint;

    /**
     * 白色畫筆
     */
    private Paint mWhitePaint;

    /**
     * 背景顏色
     */
    private int mBgColor;

    /**
     * 八卦半徑
     */
    private int mRadius;



    public BaGuaView(Context context) {
        this(context, null);
    }

    public BaGuaView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BaGuaView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.BaGuaView, defStyleAttr, 0);

        try {
            mBgColor = array.getColor(R.styleable.BaGuaView_bgColor, Color.GRAY);//默認為棕色
            mRadius = array.getInteger(R.styleable.BaGuaView_radius, 100);//默認半徑為100
        } finally {
            array.recycle();
        }

        mWhitePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mBlackPaint = new Paint(Paint.ANTI_ALIAS_FLAG);


        mWhitePaint.setColor(Color.WHITE);
        mBlackPaint.setColor(Color.BLACK);
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int width = 0;
        int height = 0;

        //設定寬度
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        if (widthMode == MeasureSpec.EXACTLY) {
            width = getPaddingLeft() + getPaddingRight() + widthSize;
        } else if (widthMode == MeasureSpec.AT_MOST) {
            width = getPaddingLeft() + getPaddingRight() + mRadius * 2;
        }

        //設定高度
        int heightMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(widthMeasureSpec);
        if (heightMode == MeasureSpec.EXACTLY) {
            height = getPaddingBottom() + getPaddingTop() + heightSize;
        } else if (widthMode == MeasureSpec.AT_MOST) {
            height = getPaddingBottom() + getPaddingTop() + mRadius * 2;
        }

        setMeasuredDimension(width, height);


    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    //設置旋轉角度
    private float degrees = -5;

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);



        //將Canvas坐標移動到畫布中心
        canvas.translate(getWidth() / 2, getHeight() / 2);
        //設置背景色
        canvas.drawColor(mBgColor);

        //設置完背景色之后讓Canvas旋轉
        degrees = degrees + 5;
        canvas.rotate(degrees);

        //設置繪制區(qū)域臼膏,這里是以畫布中心為坐標原點
        RectF rectF = new RectF(-mRadius, -mRadius, mRadius, mRadius);
        //畫左邊黑色半圓
        canvas.drawArc(rectF, 90, 180, true, mBlackPaint);
        //畫右邊白色半圓
        canvas.drawArc(rectF, -90, 180, true, mWhitePaint);

        //繪制兩個小圓
        canvas.drawCircle(0, -mRadius / 2, mRadius / 2, mBlackPaint);
        canvas.drawCircle(0, mRadius / 2, mRadius / 2, mWhitePaint);
//
        //繪制兩個魚眼硼被,畫兩個更小的圓,還以剛魚頭的圓心為圓心渗磅,半徑為原半徑的1/6,這個值可以自己設定
        canvas.drawCircle(0, -mRadius / 2, mRadius / 6, mWhitePaint);
        canvas.drawCircle(0, mRadius / 2, mRadius / 6, mBlackPaint);
        
        //每隔15ms刷新
        postInvalidateDelayed(15);
    }

}

項目地址https://github.com/xingchenfengn/CustomBaGuaView.git

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末嚷硫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子始鱼,更是在濱河造成了極大的恐慌仔掸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件医清,死亡現(xiàn)場離奇詭異起暮,居然都是意外死亡,警方通過查閱死者的電腦和手機会烙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門负懦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筒捺,“玉大人,你說我怎么就攤上這事纸厉∠悼裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵颗品,是天一觀的道長肯尺。 經(jīng)常有香客問我,道長躯枢,這世上最難降的妖魔是什么蟆盹? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮闺金,結果婚禮上逾滥,老公的妹妹穿的比我還像新娘。我一直安慰自己败匹,他們只是感情好寨昙,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掀亩,像睡著了一般舔哪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上槽棍,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天捉蚤,我揣著相機與錄音,去河邊找鬼炼七。 笑死缆巧,一個胖子當著我的面吹牛,可吹牛的內容都是我干的豌拙。 我是一名探鬼主播陕悬,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼按傅!你這毒婦竟也來了捉超?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唯绍,失蹤者是張志新(化名)和其女友劉穎拼岳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體况芒,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡惜纸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堪簿。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡痊乾,死狀恐怖,靈堂內的尸體忽然破棺而出椭更,到底是詐尸還是另有隱情哪审,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布虑瀑,位于F島的核電站湿滓,受9級特大地震影響,放射性物質發(fā)生泄漏舌狗。R本人自食惡果不足惜叽奥,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痛侍。 院中可真熱鬧朝氓,春花似錦、人聲如沸主届。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽君丁。三九已至枫夺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绘闷,已是汗流浹背橡庞。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留印蔗,地道東北人扒最。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像喻鳄,于是被迫代替她去往敵國和親扼倘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評論 25 707
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫除呵、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 2017.6.14. 星期三 天氣:雨 自從加入巴厘島特種兵訓練營培訓后爪喘,聽老師講不同的精彩課程颜曾,每天都...
    FAB菲菲閱讀 373評論 0 0
  • 酒喝桿桿酒, 肉吃坨坨肉秉剑。 阿龍真英雄泛豪, 阿妞大美人。 女子皆羞澀侥钳, 男兒多血性北救。 聚會喜歌舞, 個個好嗓音郎汪。
    光速太慢閱讀 351評論 0 1
  • 我是一名高中生 喜歡傷春悲秋价卤,偶爾也愛文藝劝萤,最熱衷的是討論各種熱播青春劇。最喜歡學習數(shù)學慎璧,卻總是考的不好床嫌。喜歡寫文...
    想上一本的孩紙閱讀 125評論 0 1