2012-05-15 38 views
-9

我想在屏幕上顯示四個定製時鐘我嘗試使用此代碼如何定製模擬時鐘

/** 
* 
* This widget display an analogic clock with two hands for hours and 
* 
* minutes. 
*/ 

@RemoteView 
public class AnalogClock2 extends View { 

    public AnalogClock2(Context context) { 

     super(context); 

     // TODO Auto-generated constructor stub 

    } 

    private Time mCalendar; 

    private Drawable mHourHand; 

    private Drawable mMinuteHand; 

    private Drawable mSecondHand; 

    private Drawable mDial; 

    private int mDialWidth; 

    private int mDialHeight; 

    private boolean mAttached; 

    private final Handler mHandler = new Handler(); 

    private float mMinutes; 

    private float mHour; 

    private boolean mChanged; 

    Context mContext; 
    public static String mtimezone="Asia/Calcutta"; 
    public AnalogClock2(Context context, AttributeSet attrs) { 

     this(context, attrs, 0); 

    } 

    public AnalogClock2(Context context, AttributeSet attrs, 

    int defStyle) { 

     super(context, attrs, defStyle); 

     Resources r = context.getResources(); 

    // TypedArray a = 

    // context.obtainStyledAttributes(

    // attrs, R.styleable.AnalogClock, defStyle, 0); 

     mContext = context; 

     // mDial = 
     // a.getDrawable(com.android.internal.R.styleable.AnalogClock_dial); 

     // if (mDial == null) { 

     mDial = r.getDrawable(R.drawable.widgetdial); 

     // } 

     // mHourHand = 
     // a.getDrawable(com.android.internal.R.styleable.AnalogClock_hand_hour); 

     // if (mHourHand == null) { 

     mHourHand = r.getDrawable(R.drawable.widgethour); 

     // } 

     // mMinuteHand = 
     // a.getDrawable(com.android.internal.R.styleable.AnalogClock_hand_minute); 

     // if (mMinuteHand == null) { 

     mMinuteHand = r.getDrawable(R.drawable.widgetminute); 

     mSecondHand = r.getDrawable(R.drawable.widgetminute); 

     // } 

     mCalendar = new Time(); 

     mDialWidth = mDial.getIntrinsicWidth(); 

     mDialHeight = mDial.getIntrinsicHeight(); 

    } 
    public static void timezone(String timezone){ 
      mtimezone=timezone; 
    } 

    @Override 
    protected void onAttachedToWindow() { 

     super.onAttachedToWindow(); 

     if (!mAttached) { 

      mAttached = true; 

      IntentFilter filter = new IntentFilter(); 

      filter.addAction(Intent.ACTION_TIME_TICK); 

      filter.addAction(Intent.ACTION_TIME_CHANGED); 

      filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 

      getContext().registerReceiver(mIntentReceiver, filter, null, mHandler); 

     } 

     // NOTE: It's safe to do these after registering the receiver since the 
     // receiver always runs 

     // in the main thread, therefore the receiver can't run before this 
     // method returns. 

     // The time zone may have changed while the receiver wasn't registered, 
     // so update the Time 

     //mCalendar = new Time(); 
     mCalendar = new Time(mtimezone); 
     // Make sure we update to the current time 

     onTimeChanged(); 

     counter.start(); 

    } 

    @Override 
    protected void onDetachedFromWindow() { 

     super.onDetachedFromWindow(); 

     if (mAttached) { 

      counter.cancel(); 

      getContext().unregisterReceiver(mIntentReceiver); 

      mAttached = false; 

     } 

    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

     int widthMode = MeasureSpec.getMode(widthMeasureSpec); 

     int widthSize = MeasureSpec.getSize(widthMeasureSpec); 

     int heightMode = MeasureSpec.getMode(heightMeasureSpec); 

     int heightSize = MeasureSpec.getSize(heightMeasureSpec); 

     float hScale = 1.0f; 

     float vScale = 1.0f; 

     if (widthMode != MeasureSpec.UNSPECIFIED && widthSize < mDialWidth) { 

      hScale = (float) widthSize/(float) mDialWidth; 

     } 

     if (heightMode != MeasureSpec.UNSPECIFIED && heightSize < mDialHeight) { 

      vScale = (float) heightSize/(float) mDialHeight; 

     } 

     System.out.println("***********************HAI****************"); 

     float scale = Math.min(hScale, vScale); 

     setMeasuredDimension(resolveSize((int) (mDialWidth * scale), widthMeasureSpec), 

     resolveSize((int) (mDialHeight * scale), heightMeasureSpec)); 

    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 

     super.onSizeChanged(w, h, oldw, oldh); 

     mChanged = true; 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     super.onDraw(canvas); 

     // // here changes on every tick////// 

     /////// 

     ///// 

     // ////// 

     // // /// 

     // // 

     boolean changed = mChanged; 

     if (changed) { 

      mChanged = false; 

     } 

     boolean seconds = mSeconds; 

     if (seconds) { 

      mSeconds = false; 

     } 

     int availableWidth = 100; 

     int availableHeight = 200; 

     int x = availableWidth/2; 

     int y = availableHeight/2; 

     final Drawable dial = mDial; 

     int w = dial.getIntrinsicWidth(); 

     int h = dial.getIntrinsicHeight(); 

     boolean scaled = false; 

     if (availableWidth < w || availableHeight < h) { 

      scaled = true; 

      float scale = Math.min((float) availableWidth/(float) w, 

      (float) availableHeight/(float) h); 

      canvas.save(); 

      canvas.scale(scale, scale, x, y); 

     } 

     if (changed) { 

      dial.setBounds(x - (w/2), y - (h/2), x + (w/2), y + (h/2)); 

     } 

     dial.draw(canvas); 

     canvas.save(); 

     canvas.rotate(mHour/12.0f * 360.0f, x, y); 

     final Drawable hourHand = mHourHand; 

     if (changed) { 

      w = hourHand.getIntrinsicWidth(); 

      h = hourHand.getIntrinsicHeight(); 

      hourHand.setBounds(x - (w/2), y - (h/3), x + (w/2), y + (h/3)); 

     } 

     hourHand.draw(canvas); 

     canvas.restore(); 

     canvas.save(); 

     canvas.rotate(mMinutes/60.0f * 360.0f, x, y); 

     // canvas.rotate(mSecond, x, y); 

     final Drawable minuteHand = mMinuteHand; 

     if (changed) { 

      w = minuteHand.getIntrinsicWidth(); 

      h = minuteHand.getIntrinsicHeight(); 

      minuteHand.setBounds(x - (w/2), y - (h/3), x + (w/2), y + (h/3)); 

     } 

     minuteHand.draw(canvas); 

     canvas.restore(); 

     canvas.save(); 

     canvas.rotate(mSecond, x, y); 

     // minuteHand = mMinuteHand; 

     if (seconds) { 

      w = mSecondHand.getIntrinsicWidth(); 

      h = mSecondHand.getIntrinsicHeight(); 

      mSecondHand.setBounds(x - (w/2), y - (h/3), x + (w/2), y + (h/3)); 

     } 

     mSecondHand.draw(canvas); 

     canvas.restore(); 

     if (scaled) { 

      canvas.restore(); 

     } 

    } 

    MyCount counter = new MyCount(10000, 1000); 

    public class MyCount extends CountDownTimer { 

     public MyCount(long millisInFuture, long countDownInterval) { 

      super(millisInFuture, countDownInterval); 

     } 

     @Override 
     public void onFinish() { 

      counter.start(); 

     } 

     @Override 
     public void onTick(long millisUntilFinished) { 

      mCalendar.setToNow(); 

      int hour = mCalendar.hour; 

      int minute = mCalendar.minute; 

      int second = mCalendar.second; 

      mSecond = 6.0f * second; 

      mSeconds = true; 

      // mChanged = true; 

      AnalogClock2.this.invalidate(); 

      // Toast.makeText(mContext, "text", Toast.LENGTH_LONG).show(); 

     } 

    } 

    boolean mSeconds = false; 

    float mSecond = 0; 

    private void onTimeChanged() { 

     mCalendar.setToNow(); 

     int hour = mCalendar.hour+4; 

     int minute = mCalendar.minute+15; 

     int second = mCalendar.second; 

     mMinutes = minute + second/60.0f; 

     mHour = hour + mMinutes/60.0f; 

     mChanged = true; 

    } 

    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      if (intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) { 

       String tz = intent.getStringExtra("time-zone"); 

       mCalendar = new Time(TimeZone.getTimeZone(tz).getID()); 

      } 
      mCalendar = new Time(mtimezone); 
      onTimeChanged(); 

      invalidate(); 

     } 

    }; 

} 
+7

發佈一個需求和一大塊代碼並不構成問題。 – Corbin

+0

問題是什麼?你有什麼錯誤嗎?如果不是,發生了什麼? – 11684

+0

沒有看到你的評論@Corbin – 11684

回答

2

@shivang請參考,這個代碼,並放四個clock.As下面的代碼。 對你有幫助。

private ImageView img; 
Handler mHandler; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Thread myThread = null; 

    Runnable runnable = new CountDownRunner(); 
    myThread = new Thread(runnable); 
    myThread.start(); 

} 

public void doRotate() { 

    runOnUiThread(new Runnable() { 
    public void run() { 
    try { 

    Date dt = new Date(); 
    int hours = dt.getHours(); 
    int minutes = dt.getMinutes(); 
    int seconds = dt.getSeconds(); 
    String curTime = hours + ":" + minutes + "::" + seconds; 
    Log.v("log_tag", "Log is here Time is now" + curTime); 
    img = (ImageView) findViewById(R.id.imgsecond); 
    RotateAnimation rotateAnimation = new RotateAnimation(
     (seconds - 1) * 6, seconds * 6, 
     Animation.RELATIVE_TO_SELF, 0.5f, 
     Animation.RELATIVE_TO_SELF, 0.5f); 

    rotateAnimation.setInterpolator(new LinearInterpolator()); 
    rotateAnimation.setDuration(1000); 
    rotateAnimation.setFillAfter(true); 

    img.startAnimation(rotateAnimation); 
    } catch (Exception e) { 

    } 
    } 
    }); 
} 

class CountDownRunner implements Runnable { 
    // @Override 
    public void run() { 
    while (!Thread.currentThread().isInterrupted()) { 
    try { 

    doRotate(); 
    Thread.sleep(1000); 
    } catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
    } catch (Exception e) { 
    Log.e("log_tag", "Error is " + e.toString()); 
    } 
    } 
    } 
} 
+0

這非常有用 – sss