Android實現類比時鐘(簡單+漂亮)–時針、分針、秒針

來源:互聯網
上載者:User
         前言

                     前不久在網上看見Android實現的類比時鐘,感覺十分有意思,這裡是地址:

                http://www.eoeandroid.com/forum.php?mod=viewthread&tid=58324可惜的是這種方式沒有

                秒錶。筆者突然對其有了興趣,也想去實現以下自己的類比時鐘。折騰了一陣子總算是弄出來了

                現在將實現方式共用出來,大家一些交流。

                     不多說,先上:

                     

                     

         準備工作

                    首先我們應該準備相關的素材:時鐘盤、時針、分針、秒針圖片.

                    時鐘盤:

                                    

                             時針:

                                                  

                            分針:

                                                  

                            秒針:     

                                                 

              源碼部分

                              設定檔,比較簡單:                     

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical"    tools:context=".MainActivity"    android:background="@color/bg">    <com.kiritor.mymodelclock.MyQAnalogClock        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"            /></LinearLayout>

                         MyQAnalogClock代碼:用於構造時鐘view以及其重新整理顯示:   

package com.kiritor.mymodelclock;import android.util.AttributeSet;import com.kiritor.mymodelclock.R;import android.content.Context;import android.graphics.*;import android.graphics.drawable.BitmapDrawable;import android.os.Handler;import android.view.View;import java.util.Calendar;import java.util.TimeZone;/** * Created by Kiritor on 13-5-30. */public class MyQAnalogClock extends View {    //時鐘盤,分針、秒針、時針對象    Bitmap mBmpDial;    Bitmap mBmpHour;    Bitmap mBmpMinute;    Bitmap mBmpSecond;    BitmapDrawable bmdHour;    BitmapDrawable bmdMinute;    BitmapDrawable bmdSecond;    BitmapDrawable bmdDial;    Paint mPaint;    Handler tickHandler;    int mWidth;    int mHeigh;    int mTempWidth = bmdSecond.getIntrinsicWidth();    int mTempHeigh;    int centerX;    int centerY;    int availableWidth = 100;    int availableHeight = 100;    private String sTimeZoneString;    public MyQAnalogClock(Context context,AttributeSet attr)    {       this(context,"GMT+8:00");    }    public MyQAnalogClock(Context context, String sTime_Zone) {        super(context);        sTimeZoneString = sTime_Zone;        mBmpHour = BitmapFactory.decodeResource(getResources(),                R.drawable.shizhen);        bmdHour = new BitmapDrawable(mBmpHour);        mBmpMinute = BitmapFactory.decodeResource(getResources(),                R.drawable.fenzhen);        bmdMinute = new BitmapDrawable(mBmpMinute);        mBmpSecond = BitmapFactory.decodeResource(getResources(),                R.drawable.miaozhen);        bmdSecond = new BitmapDrawable(mBmpSecond);        mBmpDial = BitmapFactory.decodeResource(getResources(),                R.drawable.android_clock_dial);        bmdDial = new BitmapDrawable(mBmpDial);        mWidth = mBmpDial.getWidth();        mHeigh = mBmpDial.getHeight();        centerX = availableWidth / 2;        centerY = availableHeight / 2;        mPaint = new Paint();        mPaint.setColor(Color.BLUE);        run();    }    public void run() {        tickHandler = new Handler();        tickHandler.post(tickRunnable);    }    private Runnable tickRunnable = new Runnable() {        public void run() {            postInvalidate();            tickHandler.postDelayed(tickRunnable, 1000);        }    };    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        Calendar cal = Calendar.getInstance(TimeZone                .getTimeZone(sTimeZoneString));        int hour = cal.get(Calendar.HOUR);        int minute = cal.get(Calendar.MINUTE);        int second = cal.get(Calendar.SECOND);        float hourRotate = hour * 30.0f + minute / 60.0f * 30.0f;        float minuteRotate = minute * 6.0f;        float secondRotate = second * 6.0f;        boolean scaled = false;        if (availableWidth < mWidth || availableHeight < mHeigh) {            scaled = true;            float scale = Math.min((float) availableWidth / (float) mWidth,                    (float) availableHeight / (float) mHeigh);            canvas.save();            canvas.scale(scale, scale, centerX, centerY);        }        bmdDial.setBounds(centerX - (mWidth / 2), centerY - (mHeigh / 2),                centerX + (mWidth / 2), centerY + (mHeigh / 2));        bmdDial.draw(canvas);        mTempWidth = bmdHour.getIntrinsicWidth();        mTempHeigh = bmdHour.getIntrinsicHeight();        canvas.save();        canvas.rotate(hourRotate, centerX, centerY);        bmdHour.setBounds(centerX - (mTempWidth / 2), centerY                - (mTempHeigh / 2), centerX + (mTempWidth / 2), centerY                + (mTempHeigh / 2));        bmdHour.draw(canvas);        canvas.restore();        mTempWidth = bmdMinute.getIntrinsicWidth();        mTempHeigh = bmdMinute.getIntrinsicHeight();        canvas.save();        canvas.rotate(minuteRotate, centerX, centerY);        bmdMinute.setBounds(centerX - (mTempWidth / 2), centerY                - (mTempHeigh / 2), centerX + (mTempWidth / 2), centerY                + (mTempHeigh / 2));        bmdMinute.draw(canvas);        canvas.restore();        mTempWidth = bmdSecond.getIntrinsicWidth();        mTempHeigh = bmdSecond.getIntrinsicHeight();        canvas.rotate(secondRotate, centerX, centerY);        bmdSecond.setBounds(centerX - (mTempWidth / 2), centerY                - (mTempHeigh / 2), centerX + (mTempWidth / 2), centerY                + (mTempHeigh / 2));        bmdSecond.draw(canvas);        if (scaled) {            canvas.restore();        }    }}

                        主Activity:

package com.kiritor.mymodelclock;import android.app.Activity;import android.os.Bundle;/** * Created by Kiritor on 13-5-30. */public class MainActivity extends Activity {    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

                        好了一個簡單的類比時鐘就完成了,不過通過觀察運行效果可以看出的是,筆者對

 

                時針、分針、秒針圖片的設計不是太美觀,看的不是太清楚,體驗略差。不過這不是重點

                讀者可以自己去設計一下那4張圖片,從而做出不同的效果!

                        這裡本執行個體使用Android Studio做的,完整項目源碼就不上傳了!Over!

                

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.