最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 畫一個(gè)太極圖實(shí)例代碼

 更新時(shí)間:2016年09月22日 14:47:56   作者:白一辰  
這篇文章主要介紹了Android 畫一個(gè)太極圖實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下

今天練手一下,一起來畫個(gè)太極圖吧~

最終效果如下:

最終效果

一般都是先講原理,我就反其道而行,先講實(shí)現(xiàn)吧。

1.繼承實(shí)現(xiàn)初始化方法

繼承View,實(shí)現(xiàn)基本的構(gòu)造函數(shù):

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

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

public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
  this(context, attrs, defStyleAttr, 0);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  super(context, attrs, defStyleAttr, defStyleRes);
  init();
}

在init()方法中,進(jìn)行初始化操作,這里初始化一下畫筆就好。

private Paint mPaint;

private void init() {
  initPaint();
}

/**
 * 初始化畫筆
 */
private void initPaint() {
  mPaint = new Paint();        //創(chuàng)建畫筆對(duì)象
  mPaint.setColor(Color.BLACK);    //設(shè)置畫筆顏色
  mPaint.setStyle(Paint.Style.FILL); //設(shè)置畫筆模式為填充
  mPaint.setStrokeWidth(10f);     //設(shè)置畫筆寬度為10px
  mPaint.setAntiAlias(true);     //設(shè)置抗鋸齒
  mPaint.setAlpha(255);        //設(shè)置畫筆透明度
}

在onSizeChanged()方法中獲取高寬,便于之后繪制計(jì)算。

private int mWidth;
private int mHeight;  

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

創(chuàng)建兩個(gè)路徑,一下計(jì)算就在這兩個(gè)路徑中進(jìn)行。

private Path path0 = new Path();
private Path path1 = new Path();

然后到最關(guān)鍵的onDraw()方法了,這里會(huì)分幾步來演示。

1.移動(dòng)布局到中間

@Override
protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  //移動(dòng)布局到中間
  canvas.translate(mWidth / 2, mHeight / 2);
}

ps:為了簡潔,之后的代碼都是在onDraw()中逐層增加的,之后就不寫onDraw()的外出括號(hào)了。

2.畫背景黃色  

mPaint.setColor(0xffffff00);
  path0.addRect(-400, -400, 400, 400, Path.Direction.CW);
  canvas.drawPath(path0, mPaint);

第二步.png

3.畫白色圓背景,即太極圖的白魚部分。

mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);

4.畫黑色圓背景,即太極圖的黑魚部分,和白魚一樣大小位置,只是把白魚蓋住了,這里就需要用一些boolean運(yùn)算進(jìn)行繪制了。

//白魚的背景
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);

//黑魚的背景
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);//這一段注意,之后要?jiǎng)h除

第四步.png

5.對(duì)黑魚(path1)進(jìn)行boolean計(jì)算,把不需要的部分去掉。這里就是要把圓的右半邊消除,這里就需要用到path.op()方法了。

mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);

mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);

path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
canvas.drawPath(path0, mPaint);//這一段注意,之后要?jiǎng)h除

第五步.png

6.這時(shí)候我們已經(jīng)把不需要的另一半黑色去掉了,但是黑魚應(yīng)該有個(gè)圓的頭,那么我們就拼接一個(gè)頭給它。

mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);

mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);

path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);

path0.rewind();
path0.addCircle(0, -100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.UNION);

canvas.drawPath(path1, mPaint);//這一段注意,之后要?jiǎng)h除

第六步.png

7.到這里,我們看到,只需要在繪制一個(gè)白魚的頭就可以了,那么也和第五步一樣,使用一個(gè)boolean運(yùn)算把多余的黑色去掉即可。

mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);

mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);

path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);

path0.rewind();
path0.addCircle(0, -100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.UNION);

path0.rewind();
path0.addCircle(0, 100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
canvas.drawPath(path1, mPaint);

第七步.png

8.至此,已經(jīng)繪制好了八卦圖的背景了,只需要在繪制魚的眼睛即可。

//畫黑色小圓
path0.rewind();
path0.addCircle(0, 100, 50, Path.Direction.CW);
mPaint.setColor(0xff000000);
canvas.drawPath(path0, mPaint);

//畫白色小圓
path0.rewind();
path0.addCircle(0, -100, 50, Path.Direction.CW);
mPaint.setColor(0xffffffff);
canvas.drawPath(path0, mPaint);

第八步.png

完成,最后上完整的代碼。代碼寫得有點(diǎn)亂,不過也是練習(xí)而已,哈哈。至于其中的boolean運(yùn)算什么的,之后在我的自定義View的筆記中在寫吧。

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by Whitelaning on 2016/6/28.
 * Email: whitelaning@qq.com
 */
public class TestView extends View {

  private Paint mPaint;
  private int mWidth;
  private int mHeight;

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

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

  public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
    this(context, attrs, defStyleAttr, 0);
  }

  @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init();
  }

  private void init() {
    initPaint();
  }

  /**
   * 初始化畫筆
   */
  private void initPaint() {
    mPaint = new Paint();        //創(chuàng)建畫筆對(duì)象
    mPaint.setColor(Color.BLACK);    //設(shè)置畫筆顏色
    mPaint.setStyle(Paint.Style.FILL); //設(shè)置畫筆模式為填充
    mPaint.setStrokeWidth(10f);     //設(shè)置畫筆寬度為10px
    mPaint.setAntiAlias(true);     //設(shè)置抗鋸齒
    mPaint.setAlpha(255);        //設(shè)置畫筆透明度
  }

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

  private Path path0 = new Path();
  private Path path1 = new Path();

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //移動(dòng)布局到中間
    canvas.translate(mWidth / 2, mHeight / 2);

    //畫大背景顏色
    mPaint.setColor(0xffffff00);
    path0.addRect(-400, -400, 400, 400, Path.Direction.CW);
    canvas.drawPath(path0, mPaint);

    mPaint.setColor(0xffffffff);
    path0.rewind();
    path0.addCircle(0, 0, 200, Path.Direction.CW);
    canvas.drawPath(path0, mPaint);

    mPaint.setColor(0xff000000);
    path1.addCircle(0, 0, 200, Path.Direction.CW);

    path0.rewind();
    path0.addRect(0, -200, 200, 200, Path.Direction.CW);
    path1.op(path0, Path.Op.DIFFERENCE);

    path0.rewind();
    path0.addCircle(0, -100, 100, Path.Direction.CW);
    path1.op(path0, Path.Op.UNION);

    path0.rewind();
    path0.addCircle(0, 100, 100, Path.Direction.CW);
    path1.op(path0, Path.Op.DIFFERENCE);
    canvas.drawPath(path1, mPaint);

    //畫黑色小圓
    path0.rewind();
    path0.addCircle(0, 100, 50, Path.Direction.CW);
    mPaint.setColor(0xff000000);
    canvas.drawPath(path0, mPaint);

    //畫白色小圓
    path0.rewind();
    path0.addCircle(0, -100, 50, Path.Direction.CW);
    mPaint.setColor(0xffffffff);
    canvas.drawPath(path0, mPaint);
  }
}

Whitelaning
It's very easy to be different but very difficult to be better

以上就是對(duì)Android 實(shí)現(xiàn)太極的實(shí)例代碼,有興趣朋友可以參考下,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Android?View的事件體系教程詳解

    Android?View的事件體系教程詳解

    這篇文章主要為大家介紹了Android?View的事件體系教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-03-03
  • 完美解決android M上鎖屏情況下,禁止pc通過MTP訪問手機(jī)存儲(chǔ)單元

    完美解決android M上鎖屏情況下,禁止pc通過MTP訪問手機(jī)存儲(chǔ)單元

    下面小編就為大家?guī)硪黄昝澜鉀Qandroid M上鎖屏情況下,禁止pc通過MTP訪問手機(jī)存儲(chǔ)單元。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android設(shè)備獲取掃碼槍掃描的內(nèi)容與可能遇到的問題解決

    Android設(shè)備獲取掃碼槍掃描的內(nèi)容與可能遇到的問題解決

    這篇文章主要給大家介紹了關(guān)于Android設(shè)備獲取掃碼槍掃描內(nèi)容的方法,以及在開發(fā)中可能會(huì)遇到的問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Kotlin編程基礎(chǔ)數(shù)據(jù)類型示例詳解

    Kotlin編程基礎(chǔ)數(shù)據(jù)類型示例詳解

    這篇文章主要為大家介紹了Kotlin編程基礎(chǔ)數(shù)據(jù)類型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Jetpack Compose修飾符專項(xiàng)精講

    Jetpack Compose修飾符專項(xiàng)精講

    在今年的Google/IO大會(huì)上,亮相了一個(gè)全新的 Android 原生 UI 開發(fā)框架-Jetpack Compose, 與蘋果的SwiftIUI一樣,Jetpack Compose是一個(gè)聲明式的UI框架,它可簡化并加快Android上的界面開發(fā),使用更少的代碼、強(qiáng)大的工具和直觀的 Kotlin API,快速讓應(yīng)用生動(dòng)而精彩
    2022-10-10
  • RXjava網(wǎng)絡(luò)獲取圖片數(shù)據(jù)的方法

    RXjava網(wǎng)絡(luò)獲取圖片數(shù)據(jù)的方法

    這篇文章主要為大家詳細(xì)介紹了RXjava網(wǎng)絡(luò)獲取圖片數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Android框架Volley使用之Post請(qǐng)求實(shí)現(xiàn)方法

    Android框架Volley使用之Post請(qǐng)求實(shí)現(xiàn)方法

    這篇文章主要介紹了Android框架Volley使用之Post請(qǐng)求實(shí)現(xiàn)方法,,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • 基于VideoView自定義控制面板的視頻播放器

    基于VideoView自定義控制面板的視頻播放器

    這篇文章主要為大家詳細(xì)介紹了基于VideoView自定義控制面板的視頻播放器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android使用ContentResolver搜索手機(jī)通訊錄的方法

    Android使用ContentResolver搜索手機(jī)通訊錄的方法

    這篇文章主要介紹了Android使用ContentResolver搜索手機(jī)通訊錄的方法,結(jié)合實(shí)例形式分析了Android中ContentResolver操作手機(jī)通訊錄的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-01-01
  • android app跳轉(zhuǎn)應(yīng)用商店實(shí)現(xiàn)步驟

    android app跳轉(zhuǎn)應(yīng)用商店實(shí)現(xiàn)步驟

    這篇文章主要為大家介紹了android app跳轉(zhuǎn)應(yīng)用商店實(shí)現(xiàn)步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論

常熟市| 罗山县| 茶陵县| 沾益县| 江油市| 毕节市| 福泉市| 连江县| 天气| 阜平县| 佳木斯市| 金湖县| 浦城县| 城口县| 镇平县| 靖安县| 锦屏县| 许昌市| 东阳市| 乌恰县| 开封市| 汝州市| 昌乐县| 岳普湖县| 临颍县| 马关县| 运城市| 玉龙| 阜阳市| 景东| 安丘市| 洛浦县| 贵南县| 子长县| 喀什市| 隆化县| 廊坊市| 乐陵市| 乃东县| 迁安市| 外汇|