Androidのカスタマイズ昨年時計を購入しました



Android Customization I Bought Watch Last Year



序文:
これはカスタムビューの2番目の記事です。カスタムビューはAndroidエンジニアが進歩するために必要なスキルポイントであるため、シニアエンジニアに成長したい場合は、ビューの定義を学ぶ必要があります。多くの人がカスタマイズは難しいと言いますが、そうではありません。カスタムビューはさらに面倒で、測定、レイアウト、描画、描画などの注意が必要です。1週間見るには十分です。もちろん、ビューとの相互作用もあるので、急いでイライラするのではなく、落ち着いて、一歩一歩学ぶ必要があります。楽しみのためにテーブルを描きましょう。

最初にレンダリングを見てください( 以下では、理解を容易にするために段階的に描画します ):



画像


初期化:

画像
のコメントは非常に明確です、私は主にこの方法について話します:



protected void onSizeChanged(int w, int h, int oldw, int oldh)

このメソッドは、ビューサイズが変更されたときに呼び出されます。したがって、ここで幅と高さを取得します。最初の2つのパラメーターに注意するだけで済みます。


外側の円を描きます:

次のコードはすべてonDraw()メソッドで実行されます。
画像
CanvaとPaintを知っている子供たちは、円を描くAPIに精通している必要があると思います。 4つのパラメーターは次のとおりです。
中心X座標:mWidth / 2
円の中心のY座標:mHeight / 2
円の半径:mRadius
ペイントブラシオブジェクト:mCirclePaint
これは説明してはいけません〜




縮尺と縮尺値を描画します。

画像

コメントが多すぎるため、画像が少し不明瞭になる可能性があります。ズームインして表示することをお勧めします
表には大胆なスケールと小さなスケールがあります。太字の目盛りは時間です。これは理解しやすいです。次に、ダイヤルに60のスケール値があるので、それらをループで描画することにしました。もちろん、ループは大胆なスケールと小さなスケールを区別します。

大胆なスケール :文字盤にはそれぞれ12,1,2 ... 11があります。 5で割り切れる限り、スケールは太字です。わかりやすく言うと、線分を描くことです。次の方法に注意してください。

//As shown in Figure 1: The coordinates of point A (mWidth / 2, mHeight / 2-mWidth / 2) Point B (mWidth / 2, mHeight / 2-mWidth / 2 + 60, mDegreePaint) canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2, mWidth / 2, mHeight / 2 - mWidth / 2 + 60, mDegreePaint)

1

私たちの理解を促進するために、写真を見てみましょう:
アンドロイドの座標系は数学的な座標系とは異なり、 Androidでは、コンテンツレイアウトの左上隅が座標の原点、右の水平方向がX軸の正の方向、下向きの垂直方向がY軸の正の方向です。 図に示すように、ポイントAの座標(mWidth / 2、mHeight / 2-mWidth / 2)とポイントB(mWidth / 2、mHeight / 2-mWidth / 2 + 60、mDegreePaint)は、実際には、直線、良いこれは大胆なスケールで、小さいスケールは同じですが、少し短く、すでに非常に詳細です〜

スケール値を描画します

String num = String.valueOf(i / 5) if ('0'.equals(num)) { num = '12' } //Draw time value, X coordinate: radius-half the width of the value text Y coordinate: 90 canvas.drawText(num, mWidth / 2 - mDegreePaint.measureText(num) / 2, mHeight / 2 - mWidth / 2 + 90, mDegreePaint)

APIについては説明しません。一目でわかります。テキストの左側の下から、つまり座ってテキストを描画する必要があります。どうして分かりませんか
画像
単に座標について話します:
Oは円の中心です
Mポイントは、「12」テキストのX座標の中心点です(12は長方形のボックスと見なします)。Mポイントは、長方形のボックスの下部の中点です。
Lは先ほど述べた左下の座標です。テキストを描く場所は12の左下です
Hは点Lから始まり、LHをMOに平行に接続します
今ではそれについて話すのが簡単です: 私たちの目的は点Lの座標を見つけることですか?
円の半径= mWidth / 2
点のX座標L = mWidth / 2-LM
LMとは何ですか? 12の幅の半分、androidにはテキスト幅を計算するためのAPIがすでにあります:mDegreePaint.measureText(num)
点LのY座標は、X軸からの距離であり、より任意です。たとえば、90を設定します
したがって、ポイントL(mWidth / 2-mDegreePaint.measureText(num)/ 2、mHeight / 2-mWidth / 2 + 90)
簡単ですか?

誰かが通りを叱るかもしれません!あなたは最初の垂直スケールです、他の傾斜スケールもそうです!私をしっかりと怖がらせた:

コードを見てください、ああ、いや!コードを見てください:

//Canvas rotation operation: a circle of 360 degrees, there are 60 scale divisions, each 6 degrees, so each rotation is 6 degrees, which is the first parameter of the following method, and the latter two parameters are actually the center of rotation canvas.rotate(6, mWidth / 2, mHeight / 2)

Canvasは、ディスプレイスメント、スケーリング、回転、およびミスカットを提供します。上は回転姿勢でした〜
このように、forループでこのメソッドを呼び出すだけで、スケールが1つずつ描画されます。とても幸せではないですか〜


描画ポインタ:

画像

時針を描く:
昨年購入した時計をすぐに取り出してください!次に必要です!

canvas.rotate((hour * 5*6)+(minute*0.5f),mWidth/2,mHeight/2) canvas.drawLine(mWidth/2,mHeight/2, mWidth / 2, mHeight / 2 - mWidth / 2 + 250, mHourPaint)

時針が1時間回転し、スキャン角度が30度= 5 * 6、つまり5目盛りx各目盛り度であることがわかります。
しかし、これらは常に掃引されているすべての角度です、私たちが常にそうではない場合はどうなりますか?たとえば、5:08なので、分のスイープの角度を追加する必要があります
想像してみてください。1分で回転すると、時針は30度、つまり0.5度/分をスキャンします(時針は0.5度/分をスキャンします)
さて、これは時針計算プロセスです!
次に、2つのAPIの説明があります。
canvas.save():新しい操作を行う前に、最初に以前に描画したものを保存します。つまり、状態を保存します。
canvas.restore():save()の前に操作を復元し、現在の操作を保持することです。マージ(個人的な理解)を意味すると思います

分と秒

//Minute hand canvas.save() canvas.rotate(minute * 6,mWidth/2,mHeight/2) canvas.drawLine(mWidth/2,mHeight/2, mWidth / 2, mHeight / 2 - mWidth / 2 + 150, mMinutePaint) canvas.restore() //Second hand canvas.save() canvas.rotate(second * 6,mWidth/2,mHeight/2) canvas.drawLine(mWidth/2,mHeight/2, mWidth / 2, mHeight / 2 - mWidth / 2 + 100, mSecondPaint) canvas.restore()

ここでは説明なしで比較的簡単です〜
時計をシミュレートするには、秒針を毎秒更新する必要があるため、postInvalidateDelayed(1000)redraw onDraw()を呼び出します。


メソッドの説明:

主に上のキャンバスの回転を使用しました。もちろん、キャンバスには他の操作があります。
といった:
変位(変換)
ズーム(スケール)
斜め
これらは、キャンバスの基本的な操作です。あなたが興味を持っているなら、あなたはそれを自分でググることができます。結局のところ、オンラインチュートリアルはたくさんあるので、これ以上は言いません。


推奨されるケース:


githubアドレス (よろしければキスしてください〜スタートありがとうございます〜)
画像