Android编程 - 绘制模拟时钟

时间:2011-02-16 12:22:48

标签: android time

我是Android编程的新手。如何制作一个能够绘制模拟时钟的程序,以便在用户选择时显示各个时区的时间?

我在过去的几个小时里已经使用Google搜索,但没有找到解决此问题的任何特定方法。我得到的完全困惑了我。请帮帮我。

5 个答案:

答案 0 :(得分:15)

嗨朋友我已经解决了我的问题...... 我希望与你们分享解决方案......

public class TimeShow 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;

/** Called when the activity is first created. */
@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;
}

接下来是一个名为updateTime的方法,如下所示:

private void updateTime(String str) {
       // TODO Auto-generated method stub
       if(timer!=null)
       {
           timer.cancel();
           timer=null;
       }
       timer = new Timer();
       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("Asia/Kolkata");
        if(rb2.isChecked() == true)
            updateTime("Etc/GMT-6");
        if(rb3.isChecked() == true)
            updateTime("Asia/Karachi");
    }
    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){
                e.printStackTrace();
            }
        }
        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(){
        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));
        }
    };
}

一个扩展视图的类CustomClock:

public class CustomClock extends View {
    private final float x;
    private final float y;
    private final int r=45;
    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;        
    }

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

感谢所有朋友的亲切帮助和建议......

答案 1 :(得分:2)

Souvik,

您可以从Android系统中提供的“AnalagClock”控件开始,将AnalogClock控件拖放到屏幕上,或者在main.xml中手动编写一个新标签。

答案 2 :(得分:2)

此链接应回答您的问题

http://www.androidpeople.com/android-analog-clock-example/

我希望这可以帮到你

答案 3 :(得分:0)

答案 4 :(得分:-1)

要绘制模拟时钟,请在上面发布的链接中找到灵感并设置TimeZones: http://developer.android.com/reference/android/util/TimeUtils.html(获取当前设备的TZ) http://developer.android.com/reference/java/util/TimeZone.html(与TZ合作 - 这样您就可以重新计算不同TZ的模拟时钟实例的时间)