2012-04-11 10 views
0

私は世界のアナログ時計で働いています。私はアンドロイドのアナログ時計を使っていますが、活動時には使えますが、ウィジェットでは使えません。我々はホーム画面のウィジェットhereにAnalogClockウィジェットを使用する方法の例を参照してください、これらのクラスの子孫がウィジェットでカスタムアンドロイドのアナログ時計

をサポートしていません

* AnalogClock 
* Button 
* Chronometer 
* ImageButton 
* ImageView 
* ProgressBar 
* TextView 

+0

しかしAnalogClockは、ホーム画面のウィジェットで使用することも可能widegtを拡張@RemoteViewは?そして、あなたのコード –

答えて

0

あなたは、ホーム画面のウィジェットでは、以下のウィジェットのクラスを使用することができます

0

ImageViewに基づいて独自のウィジェットを作成し、ビットマップを作成してウィジェットに定期的にプッシュするバックグラウンドサービスを作成する必要があります。 *

0
/** 

*このウィジェットは、時間と * *分間両手で類推時計を表示。 */

パブリッククラスAnalogClock2を見る{

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

    } 

}; 

}

+0

私を投稿する場合はuはそれを試してみますこのようなカスタムアナログ時計を持っていて、この時計からウィジェットを準備する方法は? –

関連する問題