1. 程式人生 > >Android 自定義View 仿螞蟻信用分析(正多邊形)

Android 自定義View 仿螞蟻信用分析(正多邊形)

從我的 "慕課-手記" 中搬過來

上一篇,我實現了正多邊形的繪製,不過是用比較取巧的方式,僅能繪製出多邊形,而不知道任意頂點座標,沒法再在頂點外繪製圖片、文字...

支付寶芝麻信用分-分析中,有個正五邊形,各頂點外還有圖片與文字,想繪製這麼一個東西就需要知道各端點的座標,那麼利用圓上的三角函式可以解出.

  • 分析並繪製正多邊形
正多邊形都有一個外切圓,圓心到各頂點作直線,那就有n個圓心角,每個角的度數: 360/n;
已知:圓心點座標,圓心角度數,半徑(圓心到各頂點的直線長度),
如圖



根據三角函式:
y=cy + Rsin(360/n);
x=cx + R
cos(360/n);
所以各頂點的座標:

for (int i = 0; i < mN; i++) {
    bx = mCx + (float) (mR * Math.cos((DEGREES_UNIT * i) * Math.PI / 180));
    by = mCy + (float) (mR * Math.sin((DEGREES_UNIT * i) * Math.PI / 180));
    canvas.drawLine(mCx, mCy, bx, by, mPaint);
    points.add(new PointF(bx, by));
}
上面求出了各頂點座標,儲存在points集合中,並從圓心連線到各頂點;
那麼還需要將各頂點間以直線相連,這個正多邊形就完成了

  • 繪製文字
與上面的方法一樣,只要將半徑增大,求出新的頂點,以繪製文字即可
可能文字的顯示位置不太理想,需要微微調整一下:
String text = "item-" + i;
float tw = mPaint.measureText(text);
float tx = rx - tw / 2;
System.out.println(mPaint.getFontMetricsInt().top);
System.out.println(mPaint.getFontMetricsInt().bottom);
float ty = ry + mPaint.getFontMetricsInt().bottom;

canvas.drawText(text, tx, ty, mPaint);

  • 任意角度起始繪製圖形
預設會以水平方向順時針繪製,即圖中右側黑色直線開始
若想任意角度開始,計算方法和繪製過程不變,只需旋轉canvas即可
如在onDraw()的一開始加上:
canvas.rotate(mRotateDegrees, mCx, mCy);
這樣一來,後續的文字繪製也跟著旋轉了,如圖:


如若不想旋轉文字,那麼上面的旋轉程式碼就放在:

canvas.save();
canvas.rotate(mRotateDegrees, mCx, mCy);
/*
省略 繪製 圖形程式碼
*/
canvas.restore();

如此一來,文字確實沒有被旋轉方向,但是文字出現的位置就不對了,
因繪製文字時,給定的座標,還是以預設繪製計算的



  • 配合上面的圖形,在頂點處繪製水平顯示的文字
上面,已經拿到預設繪製的文字起點座標了,再根據公式:
假設對圖片上任意點(x,y),繞一個座標點(cx,cy)逆時針旋轉a角度後的新的座標設為(x0, y0),有公式
x0 = (x - cx)cos(a) - (y - cy)sin(a) + cx;
y0 = (x - cx)sin(a) + (y - cy)cos(a) + cy;
即上邊canvas旋轉了多少度,這裡公式就代入這個角度數即可:
float rx, ry;
for (int i = 0; i < mN; i++) {
    p = points.get(i);
    rx = (float) (mCx + (p.x - mCx) * Math.cos(mRotateDegrees * Math.PI / 180) - (p.y - mCy)
            * Math.sin(mRotateDegrees * Math.PI / 180));
    ry = (float) (mCy + (p.x - mCx) * Math.sin(mRotateDegrees * Math.PI / 180) + (p.y - mCy)
            * Math.cos(mRotateDegrees * Math.PI / 180));

    String text = "item-" + i;
    float tw = mPaint.measureText(text);
    float tx = rx - tw / 2;
    System.out.println(mPaint.getFontMetricsInt().top);
    System.out.println(mPaint.getFontMetricsInt().bottom);
    float ty = ry + mPaint.getFontMetricsInt().bottom;

    //canvas.drawText(text, p.x, p.y, mPaint);
    canvas.drawText(text, tx, ty, mPaint);

}

最終的效果圖:


相關推薦

Android 定義View 仿螞蟻信用分析(正多邊形)

從我的 "慕課-手記" 中搬過來 上一篇,我實現了正多邊形的繪製,不過是用比較取巧的方式,僅能繪製出多邊形,而不知道任意頂點座標,沒法再在頂點外繪製圖片、文字... 支付寶芝麻信用分-分析中,有個正五邊形,各頂點外還有圖片與文字,想繪製這麼一個東西就需要知道各端點的座

Android定義View-仿華為手機管家病毒查殺類似於雷達掃描動畫效果

最近在使用華為手機管家病毒查殺時有一個類似雷達掃描的動畫,發現該動畫旋轉軸未對準圓心,如下圖: 這樣不仔細看,看不出來,咱們放大看一下,放大後如下: 現在我們可以清楚看到這個問題,於是想自己實現一把,好了,為了便於理解,這裡就按照動畫所見內容依次展開來說。 先簡單的分析一

Android 定義view-仿新浪微博#話題#插入EditText

不小心開啟新浪微博發微博頁面有個可以插入話題#…#的功能,看著挺好玩的。就照著實現了一下。 如果不知道怎麼樣效果的可以開啟微博看看。大概的功能是: 插入話題使用#特殊符號開頭和結尾 話題文字高亮顯示 刪除話題選中整個話題文字一次性刪除 可以插入多個話題

Android定義View——仿1號店垂直滾動廣告條實現

效果圖 原理分析 整個過程都是基於座標Y的增加和交換進行處理的,Y值都會一直增加到endY,然後進行交換邏輯 實現步驟 1、初始化變數 由於1號店是兩句話的滾動,所以我們也是使用兩句話來實現的 public class VerTe

android定義View仿通訊錄側邊欄滑動,實現A-Z字母檢索

我們的手機通訊錄一般都有這樣的效果,如下圖: OK,這種效果大家都見得多了,基本上所有的android手機通訊錄都有這樣的效果。那我們今天就來看看這個效果該怎麼實現。 一.概述 1.頁面功能分析 整體上來說,左邊是一個ListView,右邊是一個自定義View,但

Android定義view之實現仿抖音雙擊點贊單擊暫停特效

       2018年抖音、快手、火山等短視訊App比較火,最近自己做短視訊專案時有個需求,就是類似抖音的點贊特效,單擊螢幕時視訊暫停,再次點選時視訊恢復播放,雙擊或者連續多次點選時出現點贊特效(飄小心心特效),而且是全屏可以隨意點選,都

Android定義View仿QQ側滑選單實現

最近,由於正在做的一個應用中要用到側滑選單,所以通過查資料看視訊,學習了一下自定義View,實現一個類似於QQ的側滑選單,順便還將其封裝為自定義元件,可以實現類似QQ的側滑選單和抽屜式側滑選單兩種選單。 下面先放上效果圖: 我們這裡的側

Android定義View初探(二)——仿360垃圾清理

明天就是五一勞動節了,在這裡先祝各位程式猿勞動節快樂,別在加班了! 自從嘗試過寫自定義View(Android自定義View初探(一)——餅圖)之後,每當看到別人的應用時,總是在想別人的實現方式,或許,這就是程式猿的悲哀吧O(∩_∩)O~。 前兩天就想嘗試去

Android定義View仿Photoshop取色器ColorPicker(三)

ColorPicker 一款基於HSV顏色空間的仿Photoshop取色器的Android版顏色拾取器。 前言 注: - 1 如果你對HSV顏色空間和RGB顏色空間不夠熟悉的話,請參看該系列的第一篇文章——仿Photoshop取色器Colo

Android定義View仿京東售後稽核進度

本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 概述:同常在做商城類的App時,都會有售後的需求,而售後流程通常會因為不同的業務,而分為不確定的幾個步驟,如下圖所示: 那麼問題就來了,像這樣的效果如何實現呢?讓我們先放下這個問題,先看

Android定義View,高仿QQ音樂歌詞滾動控制元件!

最近在以QQ音樂為樣板做一個手機音樂播放器,原始碼下篇博文放出。今天我想聊的是這個QQ音樂播放器中歌詞顯示控制元件的問題,和小夥伴們一起來探討怎麼實現這個歌詞滾動的效果。OK,廢話不多說,先來看看效果圖:好,接下來我們就來看看怎麼實現這樣一個效果。本文主要包括如下幾方面內容:

Android 定義View仿華為圓形載入進度條

效果圖 實現思路 可以看出該View可分為三個部分來實現 最外圍的圓,該部分需要區分進度圓和底部的刻度圓,進度部分的刻度需要和底色刻度區分開來 中間顯示的文字進度,需要讓文字在View中居中顯示 旋轉的小圓點,小圓點需要模擬小球下落運動時的加速度

Android定義View仿Photoshop取色器ColorPicker(四)完結篇

ColorPicker 一款基於HSV顏色空間的仿Photoshop取色器的Android版顏色拾取器。 前言 注: - 1 如果你對HSV顏色空間和RGB顏色空間不夠熟悉的話,請參看該系列的第一篇文章——仿Photoshop取色器Colo

Android定義view-高仿小米視訊載入動畫效果

*本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 1、概述         前幾日出差,每晚回到酒店的時候,睡前打發時間就是拿起自己的小米手機擼劇,酒店的wifi網路實在太差,眼睜睜的看著小米視訊的載入動畫一直拼命的loading中,正好最近一直在看

Android定義View實現炫酷的主題切換動畫(仿酷安客戶端)

前兩日偶然看到了一個很炫酷的動畫效果: 判斷它是不是用的ValueAnimator, 如果是的話, 我們可以在設定-開發者選項裡面設定 “動畫時長縮放”來改變動畫時長. 所以這次我們通過設定這個選項, 把動畫速度降低之後, 很快就看出了其中的奧妙

Android定義View(LimitScrollerView-仿天貓廣告欄上下滾動效果)

  最近專案中需要在首頁做一個跑馬燈型別的廣告欄,最後上面決定仿照天貓的廣告欄效果做(中間部位),效果圖如下(右邊是我們的效果):        天貓上搶購那一欄的廣告條可以向上滾動,每次展示一條廣告,展示一定時間後,第二條廣告從下往上頂起。但

【朝花夕拾】Android定義View篇之(六)Android事件分發機制(中)從原始碼分析事件分發邏輯及經常遇到的一些“詭異”現象

前言        轉載請註明,轉自【https://www.cnblogs.com/andy-songwei/p/11039252.html】謝謝!        在上一篇文章【【朝花夕拾】Android自定義View篇之(

Android 定義View

wid declare created odi lex getwidth 實現 tdi led   最近在看鴻洋大神的博客,在看到自定義部分View部分時,想到之前案子中經常會要用到"圖片 + 文字"這類控件,如下圖所示: 之前的做法是在布局文件中,將一個Imag

Android定義view詳解

this boolean mar 處理 都是 並且 jdk text 命名 從繼承開始 懂點面向對象語言知識的都知道:封裝,繼承和多態,這是面向對象的三個基本特征,所以在自定義View的時候,最簡單的方法就是繼承現有的View 通過上面這段代碼,我定義了一個Ske

Android -- 定義view實現keep歡迎頁倒計時效果

super onfinish -m use new getc awt ttr alt 1,最近打開keep的app的時候,發現它的歡迎頁面的倒計時效果還不錯,所以打算自己來寫寫,然後就有了這篇文章。 2,還是老規矩,先看一下我們今天實現的效果   相較於我們常見的倒計時