日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android studio 绘制时钟刻度表盘的虚拟动画。

發布時間:2024/3/12 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android studio 绘制时钟刻度表盘的虚拟动画。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近,為了搞一個滑動弧形的指示器,從中明白了一些關于圓盤,之類的自定義控件核心的一般做法。在此只是粗略表述一下,關于時間的表述,并不準確。
效果如下圖所示。

package com.example.xxx.myapplication;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View;/*** 表盤刻度值*/ public class WatchView extends View {private String TAG = WatchView.class.getSimpleName();private Paint mPaintCircle;//繪制圓圈的畫筆;private float mCircleRadius;//繪制刻度盤的半徑:private float mCircleCenterX;//繪制圓圈的中心坐標X;private float mCircleCenterY;//繪制圓圈的中心坐標Y;private float padding = 50;//中心圓距離控件的邊距;private Paint mPaintDegree;//繪制刻度圓盤的刻度的畫筆;private int mDegreeCount = 24;//刻度總數;private Paint mTimeHourPointPaint;//繪制小時畫筆;private float mTimeHourLength = 0;//設置時針長度;private float mTimeMinuteLength;//設置分鐘長度;private float mTimeDegreeHourLength = 60;//刻度盤小時刻度長度;private float mTimeDegreeMintueLength = 40;//刻度盤小時刻度長度;private Paint mTimeMintuePointPaint;//繪制分針畫筆;private Mythread myThread;private boolean startOpenThreadFlag = false;private int angle = 0;public WatchView(Context context) {this(context, null);init(null, 0);}public WatchView(Context context, AttributeSet attrs) {this(context, attrs, 0);init(attrs, 0);}public WatchView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(attrs, defStyleAttr);}private void init(AttributeSet attrs, int defStyle) {//設置繪制圓的畫筆顏色:mPaintCircle = new Paint(Paint.ANTI_ALIAS_FLAG);//給Paint加上抗鋸齒標志。然后將Paint對象作為參數傳給canvas的繪制方法。 // paintCircle.setAntiAlias(true);mPaintCircle.setStrokeWidth(10);mPaintCircle.setStyle(Paint.Style.STROKE);mPaintCircle.setColor(Color.WHITE);//設置繪制刻度畫筆顏色;mPaintDegree = new Paint(Paint.ANTI_ALIAS_FLAG);mPaintDegree.setColor(Color.WHITE);mPaintDegree.setStrokeWidth(3);//設置時針畫筆;mTimeHourPointPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mTimeHourPointPaint.setStrokeWidth(20);//設置分針畫筆;mTimeMintuePointPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mTimeMintuePointPaint.setStrokeWidth(10);if (myThread == null) {startOpenThreadFlag = true;myThread = new Mythread();myThread.start();}}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawCircle(mCircleCenterX, mCircleCenterY, mCircleRadius, mPaintCircle);canvasDegree(canvas);canvasTimePoint(canvas);}/*** 繪制時針;** @param canvas*/private void canvasTimePoint(Canvas canvas) {canvas.save();//保存圓有的圖層;canvas.translate(mCircleCenterX, mCircleCenterY);// 移動繪制畫布圓心坐標;canvas.drawLine(0, 0, 120, 120, mTimeHourPointPaint);//時針; // anglefloat[] position = calculateMintuePosition(angle);// canvas.drawLine(0, 0, 120, 200, mTimeMintuePointPaint);//分針canvas.drawLine(0, 0, position[0], position[1], mTimeMintuePointPaint);//分針canvas.restore();}/*** 繪制刻度(表盤為例):*/private void canvasDegree(Canvas canvas) {canvas.save();for (int i = 0; i < mDegreeCount; i++) {//區分整點與非整點if (i == 0 || i == 6 || i == 12 || i == 18) {mPaintDegree.setStrokeWidth(5);mPaintDegree.setTextSize(40);canvas.drawLine(mCircleCenterX, mCircleCenterY - mCircleCenterX + padding, mCircleCenterX, mCircleCenterY - mCircleCenterX + padding + mTimeDegreeHourLength, mPaintDegree);String dergree = String.valueOf(i);canvas.drawText(dergree,mCircleCenterX - mPaintDegree.measureText(dergree) / 2,mCircleCenterY - mCircleCenterX + padding + 95,mPaintDegree);} else {mPaintDegree.setStrokeWidth(3);mPaintDegree.setTextSize(20);canvas.drawLine(mCircleCenterX, mCircleCenterY - mCircleCenterX + padding, mCircleCenterX, mCircleCenterY - mCircleCenterX + padding + mTimeDegreeMintueLength, mPaintDegree);String dergree = String.valueOf(i);canvas.drawText(dergree,mCircleCenterX - mPaintDegree.measureText(dergree) / 2,mCircleCenterY - mCircleCenterX + padding + 60,mPaintDegree);}canvas.rotate(360 / mDegreeCount, mCircleCenterX, mCircleCenterY);//每次畫布圍繞圓心旋轉的的度數。}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mCircleCenterX = getWidth() / 2;mCircleCenterY = getHeight() / 2;if (mCircleCenterX > mCircleCenterY) {mCircleRadius = mCircleCenterY - padding;} else {mCircleRadius = mCircleCenterX - padding;}mTimeHourLength = mCircleRadius - 2 * mTimeDegreeHourLength;mTimeMinuteLength = mCircleRadius - 2 * mTimeDegreeMintueLength;}/*** 計算分針的坐標。** @param angle* @return*/private float[] calculateMintuePosition(float angle) {float x = (float) (mTimeMinuteLength * Math.cos(Math.toRadians(angle)));float y = (float) (mTimeMinuteLength * Math.sin(Math.toRadians(angle)));return new float[]{x, y};}/*** 計算時針的坐標。** @param angle* @return*/private float[] calculateHourPosition(float angle) {float x = (float) (mTimeHourLength * Math.cos(Math.toRadians(angle)));float y = (float) (mTimeHourLength * Math.sin(Math.toRadians(angle)));return new float[]{x, y};}@Overridepublic boolean onTouchEvent(MotionEvent event) {//此時的eventX與eventY為控件的右上頂點坐標值;float eventX = event.getX();float eventY = event.getY();//要把觸摸點的坐標原點移動到控件的中心,float centerEventX = event.getX() - mCircleCenterX;float centerEventY = event.getY() - mCircleCenterY;switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "eventX==" + eventX);Log.d(TAG, "eventY==" + eventY);Log.d(TAG, "centerEventX===================" + centerEventX);Log.d(TAG, "centerEventY===================" + centerEventY);break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:break;}return true;}public class Mythread extends Thread {@Overridepublic void run() {while (startOpenThreadFlag) {angle++;if (angle == 360) {angle = 0;}postInvalidate();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}} }

布局文件xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.example.xxx.myapplication.WatchView android:layout_width="400dp"android:layout_height="400dp"android:layout_centerInParent="true"android:background="@color/colorWatch" /></RelativeLayout>

總結

以上是生活随笔為你收集整理的android studio 绘制时钟刻度表盘的虚拟动画。的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。