2011-12-06 78 views
4

實際上,在選擇特定時區後,我必須製作一個顯示世界時間的模擬時鐘小工具。我創建了一個模擬時鐘選擇 選擇時區。我希望具有更新時區的同一時鐘應該顯示爲一個小部件。我沒有得到如何只把時鐘視圖作爲一個部件。根據不同時區創建顯示時間的模擬時鐘小部件

我的代碼是:

package nEx.Software.Tutorials.Widgets.AnalogClock; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import java.util.TimeZone; 
import java.util.Timer; 
import java.util.TimerTask; 
//import nEx.Software.Tutorials.Widgets.AnalogClock.main.CustomClock; 
//import nEx.Software.Tutorials.Widgets.AnalogClock.main.MyTime; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.FrameLayout; 
import android.widget.LinearLayout; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.TextView; 
public class Info extends Activity implements RadioGroup.OnCheckedChangeListener 
{ 

    Context context; 
     TextView tv; 
     RadioButton rb1, rb2, rb3; 
     RadioGroup r1; 
     FrameLayout fl1; 
     LinearLayout l1; 
     Timer timer; 
     Date result; 
     ViewGroup.LayoutParams lp1; 
     Drawable bck; 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); setContentView(R.layout.main); 

     context = this; 
     tv = (TextView) findViewById(R.id.TextView01); 
     r1 = (RadioGroup) findViewById(R.id.RadioGroup01); 
     rb1 = (RadioButton) findViewById(R.id.RadioButton01); 
     rb2 = (RadioButton) findViewById(R.id.RadioButton02); 
     rb3 = (RadioButton) findViewById(R.id.RadioButton03); 
     fl1 = (FrameLayout) findViewById(R.id.FrameLayout01); 
     bck = this.getResources().getDrawable(R.drawable.clockface); 
     fl1.setBackgroundDrawable(bck); 
     lp1 = fl1.getLayoutParams(); 
     r1.setOnCheckedChangeListener(this); 
     result = null; 
    } 
    private void updateTime(String str) { 
     // TODO Auto-generated method stub 
     if (timer != null) { 
      timer.cancel(); 
      timer = null; 
     } 
     timer = new Timer();  //digital clock 
     MyTime mt = new MyTime(this, str); 
     timer.schedule(mt, 1, 1000); 
    } 
    public void onCheckedChanged(RadioGroup group, int checkedId) { 
     // TODO Auto-generated method stub 
     if (rb1.isChecked() == true) { 
      updateTime("GMT"); 

     } 
     if (rb2.isChecked() == true) { 
      updateTime("EST"); 
     } 
     if (rb3.isChecked() == true) { 
      updateTime("MST"); 
     } 
    } 
    public class MyTime extends TimerTask { 
     String tz; 
     public MyTime(Context context, String str) { 
      tz = str; 
     } 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       Date date = new Date(); 
       date = getDateInTimeZone(date, tz); 
       //System.out.println(date.toLocaleString()); 
       result = date; 
       handler.sendEmptyMessage(0); 
      } catch (Exception e) { 
      } 
     } 
     private Date getDateInTimeZone(Date currentDate, String timeZoneId) { 
      TimeZone tz = TimeZone.getTimeZone(timeZoneId); 
      Calendar mbCal = new GregorianCalendar(tz); 
      mbCal.setTimeInMillis(currentDate.getTime()); 
      Calendar cal = Calendar.getInstance(); 
      cal.set(Calendar.YEAR, mbCal.get(Calendar.YEAR)); 
      cal.set(Calendar.MONTH, mbCal.get(Calendar.MONTH)); 
      cal.set(Calendar.DAY_OF_MONTH, mbCal.get(Calendar.DAY_OF_MONTH)); 
      cal.set(Calendar.HOUR_OF_DAY, mbCal.get(Calendar.HOUR_OF_DAY)); 
      cal.set(Calendar.MINUTE, mbCal.get(Calendar.MINUTE)); 
      cal.set(Calendar.SECOND, mbCal.get(Calendar.SECOND)); 
      cal.set(Calendar.MILLISECOND, mbCal.get(Calendar.MILLISECOND)); 
      return cal.getTime(); 
     } 
    } 
    Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      tv.setText(result.toLocaleString()); 
      //System.out.println(result.getHours()+" "+result.getMinutes()); 
      fl1.removeAllViews(); 
      fl1.addView(new CustomClock(context, lp1.height/2, lp1.width/2, result)); 
     } 
    }; 
    public class CustomClock extends View { 
     private final float x; 
     private final float y; 
     private final int r = 70; 
     private final Date date; 
     private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     public CustomClock(Context context, float x, float y, Date date) { 
      super(context); 
      this.x = x; 
      this.y = y; 
      this.date = date; 
     } 
     @Override 
     protected void onDraw(Canvas canvas) { 
      super.onDraw(canvas); 
      //canvas.drawCircle(x, y, r, mPaint); 
      float sec = (float) date.getSeconds(); 
      float min = (float) date.getMinutes(); 
      float hour = (float) date.getHours() + min/60.0f; 
      mPaint.setColor(0xFFFF0000); 
      canvas.drawLine(x, y, (float) (x + (r - 15) * Math.cos(Math.toRadians((hour/12.0f * 360.0f) - 90f))), (float) (y + (r - 10) * Math.sin(Math.toRadians((hour/12.0f * 360.0f) - 90f))), mPaint); 
      canvas.save(); 
      mPaint.setColor(0xFF0000FF); 
      canvas.drawLine(x, y, (float) (x + r * Math.cos(Math.toRadians((min/60.0f * 360.0f) - 90f))), (float) (y + r * Math.sin(Math.toRadians((min/60.0f * 360.0f) - 90f))), mPaint); 
      canvas.save(); 
      mPaint.setColor(0xFFA2BC13); 
      canvas.drawLine(x, y, (float) (x + (r + 10) * Math.cos(Math.toRadians((sec/60.0f * 360.0f) - 90f))), (float) (y + (r + 15) * Math.sin(Math.toRadians((sec/60.0f * 360.0f) - 90f))), mPaint); 
     } 
    } 
//} 
    // } 


} 

回答

0

程式小工具非常有限名爲「遠程視圖」一些看法。即使他們不那麼靈活。 這個決定背後的原因可能是安全性。你將不得不爲這個問題得到一個解決方法,因爲你不能創建自己的自定義視圖作爲appwidget。 這裏列出了所有可用的遠程視圖: http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout

如果您願意,您可以使用它們的模擬時鐘。

相關問題