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(); } } } }
