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

Android仿小米時(shí)鐘效果

 更新時(shí)間:2017年03月13日 10:01:07   作者:jane_dxj  
這篇文章主要為大家詳細(xì)介紹了Android仿小米時(shí)鐘效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

我在一個(gè)[博客] android高仿小米時(shí)鐘(使用Camera和Matrix實(shí)現(xiàn)3D效果)上面看到了小米時(shí)鐘實(shí)現(xiàn).特別感興趣.就認(rèn)真的看了一遍.并自己敲了一遍.下面說(shuō)下我自己的理解和我的一些改進(jìn)的地方效果真的特別棒就發(fā)布了自己的時(shí)鐘應(yīng)用。

先上圖(電腦沒(méi)有g(shù)if截圖軟件.大家湊合看.哪個(gè)軟件好也可以給我推薦下)

圖一

話不多說(shuō),首先自定義控件XimiClockView繼承view  并做一些初始化的操作
看到的漂亮?xí)r鐘圖片我自己畫(huà)的效果圖(以后媽媽再也不用擔(dān)心我遲到了)

圖二

public XimiClockView(Context context) {
 super(context);
 init(context, null);
 }

 public XimiClockView(Context context, AttributeSet attrs) {
 super(context, attrs);
 init(context, attrs);
 }

 public XimiClockView(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 init(context, attrs);
 }

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 public XimiClockView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
 super(context, attrs, defStyleAttr, defStyleRes);
 init(context, attrs);
 }

 /**
 * 進(jìn)行一些初始化的操作
 *
 * @param context
 * @param attrs
 */
 private void init(Context context, AttributeSet attrs) {
 if (attrs == null) return;
 TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyClockView);
 backGroundColor = array.getColor(R.styleable.MyClockView_clockBackColor, Color.parseColor("#2078A8"));
 drakColor = array.getColor(R.styleable.MyClockView_clockDarkColor, Color.parseColor("#96C2D8"));
 lightColor = array.getColor(R.styleable.MyClockView_clockLightColor, Color.parseColor("#ffffff"));
 array.recycle();//注意這里別忘了調(diào)用recycle()方法,[原因](http://www.cnblogs.com/kissazi2/p/4049982.html)
 //設(shè)置背景色
 setBackgroundColor(backGroundColor);
 //文本畫(huà)筆
 textPaint = new Paint();
 textPaint.setColor(drakColor);
 textPaint.setTextSize(25);
 textRect = new Rect();
 }

然后在onSizeChange方法中調(diào)用獲取時(shí)鐘半徑,和一些其他的計(jì)算

 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
 super.onSizeChanged(w, h, oldw, oldh);
 //獲取時(shí)鐘的半徑
 mRadius = Math.min(w - getPaddingLeft() - getPaddingRight(), h - getPaddingTop() - getPaddingBottom()) / 2;
 //為了防止時(shí)鐘旋轉(zhuǎn)的時(shí)候超出了界限,默認(rèn)加一個(gè)padding值
 defaultPadding = 0.12f * mRadius;
 //圓弧的寬度
 mCircleWidth = 0.012f * mRadius;
 //圓環(huán)的寬度
 mCircleRingWidth = 0.12f*mRadius;
 paddingLeft = w / 2 - mRadius + getPaddingLeft() + defaultPadding;
 paddingTop = h / 2 - mRadius + getPaddingTop() + defaultPadding;
 paddingRight = w / 2 - mRadius + getPaddingRight() + defaultPadding;
 paddingBottom = h / 2 - mRadius + getPaddingBottom() + defaultPadding;
 mSweepGradient = new SweepGradient(w / 2,h / 2 ,new int[]{drakColor,lightColor},new float[]{0.75f,1f});
 }

畫(huà)Text

@Override
 protected void onDraw(Canvas canvas) {
 mCanvas = canvas;
 drawTimeText();
 }

 /**
 * 畫(huà)12 /3 /6 /9時(shí)間
 */
 private void drawTimeText() {
 String str = "12";
 textPaint.getTextBounds(str, 0, str.length(), textRect);
 int lengthTextWidth = textRect.width();
 int textHeight = textRect.height();
 int width=getWidth();
 int height=getHeight();
 mCanvas.save();//保存畫(huà)布的狀態(tài)
 mCanvas.drawText(str, width / 2-lengthTextWidth/2,paddingTop+textHeight,textPaint);
 str="3";
 textPaint.getTextBounds(str, 0, str.length(), textRect);
 int smallTextWidth = textRect.width();
 mCanvas.drawText("3",width-paddingRight-lengthTextWidth/2-smallTextWidth/2,height/2+textHeight/2,textPaint);
 mCanvas.drawText("6",width / 2-smallTextWidth/2,height-paddingBottom,textPaint);
 mCanvas.drawText("9",paddingLeft,height/2+textHeight/2,textPaint);
 mCanvas.restore();//取出畫(huà)布的狀態(tài)
 }

崩潰寫(xiě)完了,我發(fā)表時(shí)候提示我沒(méi)有登錄,然后發(fā)表異常,然后我一刷新沒(méi)了,,,又重新寫(xiě)一遍,

接下來(lái)畫(huà)圓弧

 /**
 * 畫(huà)圓弧
 */
 private void drawCircleArc() {
 mCanvas.save();
 mCirclePaint.setStyle(Paint.Style.STROKE);//設(shè)置空心模式
 mCirclePaint.setStrokeWidth(mCircleWidth);//設(shè)置圓弧寬度
 mCircleRectF.set(paddingLeft + textRect.width() / 2, paddingTop + textRect.height() / 2, getWidth() - paddingRight - textRect.width() / 2, getHeight() - paddingBottom - textRect.height() / 2);
 for (int x = 0; x < 4; x++) {
 //圓弧分四段來(lái)畫(huà),一段話80度
  mCanvas.drawArc(mCircleRectF, 5 + 90 * x, 80, false, mCirclePaint);
 }
 mCanvas.restore();
 }

畫(huà)刻度

/**
 * 畫(huà)圓環(huán)和刻度
 */
 private void drawCircleRing() {
 mCanvas.save();
 //畫(huà)圓環(huán)
 mCircleRingRectF.set(paddingLeft+textRect.height()/2+1.5f*mCircleRingWidth,paddingTop+textRect.height()/2+1.5f*mCircleRingWidth,getWidth()-paddingRight-textRect.height()/2-1.5f*mCircleRingWidth,
  getHeight()-paddingBottom-textRect.height()/2-1.5f*mCircleRingWidth);
 mMatrix.setRotate(mDegreeS-90,getWidth()/2,getHeight()/2);
 mSweepGradient.setLocalMatrix(mMatrix);
 mCircleRingPaint.setStyle(Paint.Style.STROKE);
 mCircleRingPaint.setStrokeWidth(mCircleRingWidth);
 mCircleRingPaint.setShader(mSweepGradient);
 mCanvas.drawArc(mCircleRingRectF,0,360,false,mCircleRingPaint);
 //畫(huà)刻度
 mScaleLinePaint.setStrokeWidth(0.1f*mCircleRingWidth);//設(shè)置線的寬度
 for (int i=0;i<200;i++){
  //畫(huà)刻度線
  mCanvas.drawLine(getWidth()/2,paddingTop+textRect.height()/2+mCircleRingWidth,getWidth()/2,paddingTop+textRect.height()/2+2*mCircleRingWidth,mScaleLinePaint);
  mCanvas.rotate(1.8f,getWidth()/2,getHeight()/2);//旋轉(zhuǎn)角度
 }
 mCanvas.restore();
 }

畫(huà)秒針

 /**
 * 畫(huà)秒針
 * 秒針針是不規(guī)則的圖形
 * 就用到了Path這個(gè)類
 *
 */
 private void drawSoundHand() {
 mCanvas.save();
 path.reset();
 mCanvas.rotate(mDegreeS,getWidth()/2,getHeight()/2);//旋轉(zhuǎn)的角度和旋轉(zhuǎn)的圓心
 path.moveTo(getWidth()/2,paddingTop+textRect.height()/2+0.27f*mRadius);//開(kāi)始的點(diǎn)
 path.lineTo(getWidth()/2+0.03f*mRadius,paddingTop+textRect.height()/2+0.31f*mRadius);//直線到這個(gè)位置
 path.lineTo(getWidth()/2-0.03f*mRadius,paddingTop+textRect.height()/2+0.31f*mRadius);//直線到這個(gè)位置
 path.close();
 mCanvas.drawPath(path,mSoundHandPaint);
 mCanvas.restore();
 }

畫(huà)時(shí)針

 /**
 * 畫(huà)時(shí)針
 */
 private void drawHourHand() {
 mCanvas.save();
 mCanvas.rotate(mDegreeH,getWidth()/2,getHeight()/2);
 hourHandPath.reset();
 hourHandPath.moveTo(getWidth()/2-0.02f*mRadius,getHeight()/2);
 hourHandPath.lineTo(getWidth()/2-0.01f*mRadius,getHeight()/2-0.35f*mRadius);
 //貝塞爾曲線
 hourHandPath.quadTo(getWidth()/2,getHeight()/2-0.38f*mRadius,getWidth()/2+0.01f*mRadius,getHeight()/2-0.35f*mRadius);
 hourHandPath.lineTo(getWidth()/2+0.02f*mRadius,getHeight()/2);
 hourHandPath.close();
 mCanvas.drawPath(hourHandPath,mHourHandPaint);
 mCanvas.restore();
 }

畫(huà)分針

 /**
 * 畫(huà)分針
 */
 private void drawMinnuteHand() {
 mCanvas.save();
 mCanvas.rotate(mDegreeM,getWidth()/2,getHeight()/2);
 mMinutePath.reset();
 mMinutePath.moveTo(getWidth()/2-0.012f*mRadius,getHeight()/2);
 mMinutePath.lineTo(getWidth()/2-0.006f*mRadius,getHeight()/2-0.40f*mRadius);
 mMinutePath.quadTo(getWidth()/2,getHeight()/2-0.43f*mRadius,getWidth()/2+0.006f*mRadius,getHeight()/2-0.40f*mRadius);
 mMinutePath.lineTo(getWidth()/2+0.012f*mRadius,getHeight()/2);
 mMinutePath.close();
 mCanvas.drawPath(mMinutePath,mMinutePaint);
 //畫(huà)圈圈蓋著時(shí)針的尾部
 mCanvas.drawCircle(getWidth()/2,getHeight()/2,0.03f*mRadius,mMinutePaint);
 mCanvas.drawCircle(getWidth()/2,getHeight()/2,0.015f*mRadius,mCircleMinPaint);
 mCanvas.restore();
 }

上我的measure的方法

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 setMeasuredDimension(getMeasure(widthMeasureSpec), getMeasure(heightMeasureSpec));
 }

 private int getMeasure(int measureSpec) {
 int result;
 int mode = MeasureSpec.getMode(measureSpec);
 int size = MeasureSpec.getSize(measureSpec);
 if (mode == MeasureSpec.EXACTLY) {
  result = size;
 } else {
  result = 800;
  if (mode == MeasureSpec.AT_MOST) {
  result = Math.min(result, size);
  }
 }
 return result;
 }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android SpringAnimation彈性動(dòng)畫(huà)解析

    Android SpringAnimation彈性動(dòng)畫(huà)解析

    這篇文章主要為大家詳細(xì)介紹了Android SpringAnimation彈性動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android使用socket進(jìn)行二進(jìn)制流數(shù)據(jù)傳輸

    Android使用socket進(jìn)行二進(jìn)制流數(shù)據(jù)傳輸

    這篇文章主要介紹了Android使用socket進(jìn)行二進(jìn)制流數(shù)據(jù)傳輸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-04-04
  • Android onCreate( )方法詳細(xì)介紹

    Android onCreate( )方法詳細(xì)介紹

    本文主要介紹Android onCreate( )方法,做Android應(yīng)用的朋友對(duì)onCreate()的方法并不陌生,在開(kāi)發(fā)應(yīng)用的時(shí)候大家應(yīng)該注意什么呢,這里給大家詳細(xì)說(shuō)明
    2016-09-09
  • Android實(shí)現(xiàn)跑馬燈效果的方法

    Android實(shí)現(xiàn)跑馬燈效果的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)跑馬燈效果的方法,通過(guò)頁(yè)面XML布局設(shè)置實(shí)現(xiàn)帶有跑馬燈效果的文字滾動(dòng)顯示功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Android動(dòng)態(tài)控制狀態(tài)欄顯示和隱藏

    Android動(dòng)態(tài)控制狀態(tài)欄顯示和隱藏

    這篇文章主要介紹了Android動(dòng)態(tài)控制狀態(tài)欄顯示和隱藏,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • android中開(kāi)啟actionbar的兩種方法

    android中開(kāi)啟actionbar的兩種方法

    這篇文章主要介紹了android中開(kāi)啟actionbar的兩種方法,本文給出了靜態(tài)開(kāi)啟和動(dòng)態(tài)開(kāi)啟2種方法,需要的朋友可以參考下
    2015-06-06
  • Android中設(shè)置組件半透明和透明的效果示例

    Android中設(shè)置組件半透明和透明的效果示例

    這篇文章主要給大家介紹了Android中設(shè)置組件半透明和透明效果的相關(guān)資料,文中給出了詳細(xì)的介紹和示例代碼,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-05-05
  • Android中SharedPreference使用實(shí)例講解

    Android中SharedPreference使用實(shí)例講解

    這篇文章主要介紹了Android中SharedPreference使用方法,實(shí)現(xiàn)登陸界面記住密碼功能,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 利用Android模仿微信攝像圓環(huán)進(jìn)度效果實(shí)例

    利用Android模仿微信攝像圓環(huán)進(jìn)度效果實(shí)例

    圓環(huán)進(jìn)度條,大家應(yīng)該都見(jiàn)過(guò),而這篇文章主要給大家介紹了關(guān)于利用Android模仿微信攝像圓環(huán)進(jìn)度效果的相關(guān)資料,實(shí)現(xiàn)后的效果非常不錯(cuò),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Recycleview實(shí)現(xiàn)無(wú)限自動(dòng)輪播

    Recycleview實(shí)現(xiàn)無(wú)限自動(dòng)輪播

    這篇文章主要為大家詳細(xì)介紹了Recycleview實(shí)現(xiàn)無(wú)限自動(dòng)輪播,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評(píng)論

顺昌县| 晋城| 日照市| 固镇县| 天长市| 吴桥县| 澄城县| 湛江市| 天气| 荔浦县| 侯马市| 岑巩县| 八宿县| 遂昌县| 志丹县| 沙河市| 林口县| 手机| 东明县| 宝丰县| 云浮市| 桐梓县| 黔江区| 宁国市| 尤溪县| 阿尔山市| 衡东县| 合山市| 佛冈县| 应城市| 樟树市| 游戏| 柳江县| 沙湾县| 许昌市| 含山县| 长乐市| 凭祥市| 定西市| 焦作市| 恩施市|