Программирование Android - рисование аналоговых часов - PullRequest
0 голосов
/ 16 февраля 2011

Я новичок в программировании Android.Как я могу сделать программу, которая будет рисовать аналоговые часы так, чтобы они могли показывать время для разных часовых поясов по выбору пользователя?

Я уже гуглил в течение последних нескольких часов, но не нашел никакого конкретного решенияк этой проблеме.То, что я получил, полностью озадачило меня.Пожалуйста, помогите мне.

Ответы [ 5 ]

15 голосов
/ 18 февраля 2011

Привет, друзья! Я решил мою проблему ...... Я хочу поделиться решением с вами, ребята ...

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

Спасибо всем моим друзьям за вашу помощь и предложения ....

2 голосов
/ 16 февраля 2011

Эта ссылка должна ответить на ваш запрос

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

Я надеюсь, что это поможет вам

2 голосов
/ 16 февраля 2011

Souvik,

Вы можете начать с элемента управления "AnalagClock", доступного в системе Android, перетащить элемент управления AnalogClock на экран или написать новый тег вручную в main.xml.

0 голосов
/ 16 февраля 2011

Для рисования аналоговых часов, найдите вдохновение в ссылках, размещенных выше, и для установки часовых поясов: http://developer.android.com/reference/android/util/TimeUtils.html (получить TZ текущего устройства) http://developer.android.com/reference/java/util/TimeZone.html (работа с TZ - чтобы вы могли пересчитать время экземпляров аналоговых часов для разных TZ)

0 голосов
/ 16 февраля 2011

Вот пример виджета аналоговых часов ..

http://nexsoftware.net/wp/2009/07/29/tutorial-creating-a-custom-analogclock-widget/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...