自己的AnalogClock指针 时分秒

    技术2026-01-03  7

     

    package  com.android.clockview;      import  java.util.Calendar;      import  java.util.TimeZone;                 import  android.R.integer;   import  android.app.Activity;      import  android.content.Context;      import  android.graphics.Bitmap;      import  android.graphics.BitmapFactory;      import  android.graphics.Canvas;      import  android.graphics.Color;      import  android.graphics.Matrix;      import  android.graphics.Paint;      import  android.graphics.drawable.BitmapDrawable;   import  android.os.Bundle;      import  android.os.Handler;      import  android.util.Log;   import  android.view.View;      import  android.view.ViewGroup;   import  android.widget.LinearLayout;   import  android.widget.RelativeLayout;           public   class  ClockView  extends  Activity {                 private   static  String TAG =  "ClockView" ;                private   final   int  FP = ViewGroup.LayoutParams.FILL_PARENT;       private   final   int  WC = ViewGroup.LayoutParams.WRAP_CONTENT;              private  QAnalogClock clock1;                      public   void  onCreate(Bundle savedInstanceState) {              super .onCreate(savedInstanceState);              LinearLayout lLayout = new  LinearLayout( this );           lLayout.setLayoutParams(new  LinearLayout.LayoutParams(FP, FP));           lLayout.setOrientation(LinearLayout.VERTICAL);                      clock1 = new  QAnalogClock( this , "GMT+8:00" );               lLayout.addView(clock1, new  LinearLayout.LayoutParams(WC,WC));                        setContentView(lLayout);                          }          /*        * Customized AnalogClock View        * 1)Draw dial by bitmap        * 2)Draw hour/minute/second by BitmapDrawable        */               class  QAnalogClock  extends  View {              //Original bitmap of dial,hour,minute,second            Bitmap mBmpDial;             Bitmap mBmpHour;              Bitmap mBmpMinute;              Bitmap mBmpSecond;                      //Drawable of dial,hour,minute,second            BitmapDrawable bmdHour;           BitmapDrawable bmdMinute;           BitmapDrawable bmdSecond;           BitmapDrawable bmdDial;                      Paint mPaint;//Paint draw on canvas                       Handler tickHandler;                              int  mWidth;    //Dial width            int  mHeigh;    //Dial height            int  mTempWidth;    //Hour/Minute/Second width            int  mTempHeigh;    //Hour/Minute/Second height            int  centerX ;  //Hour/Minute/Second picture center x              int  centerY ;  //Hour/Minute/Second picture center y                       int  availableWidth =  100 ; //Available width of the dial            int  availableHeight =  100 ; //Available height of the dial                       private  String sTimeZoneString;                      public  QAnalogClock(Context context,String sTime_Zone) {                  super (context);                  sTimeZoneString = sTime_Zone;                              mBmpHour = BitmapFactory.decodeResource(getResources(), R.drawable.clockdroid2_hour);                  bmdHour = new  BitmapDrawable(mBmpHour);                              mBmpMinute = BitmapFactory.decodeResource(getResources(), R.drawable.clockdroid2_minute);                 bmdMinute = new  BitmapDrawable(mBmpMinute);                              mBmpSecond = BitmapFactory.decodeResource(getResources(), R.drawable.clockdroid2_minute);                 bmdSecond = new  BitmapDrawable(mBmpSecond);                              mBmpDial = BitmapFactory.decodeResource(getResources(), R.drawable.clockdroid2_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();//Begin to send update event ,how to sync?            }                             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;                           //   Log.d(TAG, "hour is "+hour+" minute is "+minute);             //   Log.d(TAG, "hourRotate is "+hourRotate+" minuteRotate is "+minuteRotate+" secondRotate is "+secondRotate);                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);               }                            //  Log.d(TAG,"Canvas's height is "+canvas.getHeight() +" width is "+canvas.getWidth());                              //Draw dial on view                bmdDial.setBounds(centerX-(mWidth/2 ),centerY-(mHeigh/ 2 ),centerX+(mWidth/ 2 ),centerY+(mHeigh/ 2 ));                           bmdDial.draw(canvas);                              //Draw hour on view                mTempWidth = bmdHour.getIntrinsicWidth();               mTempHeigh = bmdHour.getIntrinsicHeight();               canvas.save();//Save non rotated canvas                canvas.rotate(hourRotate,  centerX, centerY);                      bmdHour.setBounds(centerX-(mTempWidth/2 ),centerY-(mTempHeigh/ 2 ),centerX+(mTempWidth/ 2 ),centerY+(mTempHeigh/ 2 ));                           bmdHour.draw(canvas);                                 canvas.restore(); //restore canvas to last saved state                                      //Draw Minute on view                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();                                  //Draw Second on view                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();               }          }          }      }   

    最新回复(0)