在android中实现iphone时钟app的秒表功能

大致的布局差不多,加了个背景

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg_stopwatch"
    android:orientation="vertical" >
    
    <TextView 
        android:layout_width="match_parent"
        android:layout_height="41dp"
        android:layout_gravity="center_horizontal"
        android:gravity="center"
        android:textColor="@color/white"
        android:textSize="23sp"
        android:text="秒表"/>
    
    <TextView 
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/darkgrey"
        />
    
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        
        <RelativeLayout 
	        android:layout_width="match_parent"
	        android:layout_height="match_parent"
	        android:layout_weight="3">
	        
            <TextView 
                android:id="@+id/tv_timemain"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:layout_centerInParent="true"
                android:textColor="@color/white"
                android:textSize="72sp"
                android:text="00:00.00"/>

            <TextView
                android:id="@+id/tv_times"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_above="@+id/tv_timemain"
                android:layout_alignRight="@+id/tv_timemain"
                android:textColor="@color/grey"
                android:textSize="22sp"
                android:text="00:00.00" />
	        
	    </RelativeLayout>
	    
        <LinearLayout 
	        android:layout_width="match_parent"
	        android:layout_height="match_parent"
	        android:layout_weight="2"
	        android:orientation="vertical">
            
            <TextView 
		        android:layout_width="match_parent"
		        android:layout_height="1dp"
		        android:background="@color/darkgrey"/>
            
            <RelativeLayout 
                android:layout_weight="3"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                
                <LinearLayout 
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true"
                    android:orientation="horizontal">
                    
                    <RelativeLayout 
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">
                        
	                    <com.example.stopwatch.RoundImageView 
	                        android:id="@+id/rimg_set"
	                        android:layout_width="80dp"
	                        android:layout_height="80dp"                        
	                        android:src="@drawable/white"/>
	                    
	                    <TextView 
	                        android:id="@+id/tv_set"
	                        android:layout_width="wrap_content"
	                        android:layout_height="wrap_content"
	                        android:layout_centerInParent="true"
	                        android:textColor="@color/green"
	                        android:textSize="18sp"
	                        android:text="启动"/>
                    
                    </RelativeLayout>
                    
                    <RelativeLayout 
                        android:id="@+id/rl_cal"
                        android:layout_width="80dp"
                        android:layout_height="80dp"  
                        android:layout_marginLeft="50dp"
                        android:alpha="0.7"
                        android:background="@null">
                        
	                  	<ImageView
	                        android:id="@+id/img_cal"
	                        android:layout_width="80dp"
	                        android:layout_height="80dp"                        
	                        android:src="@drawable/selector_cal"/>
	                    
	                    <TextView 
	                        android:id="@+id/tv_cal"
	                        android:layout_width="wrap_content"
	                        android:layout_height="wrap_content"
	                        android:layout_centerInParent="true"
	                        android:textColor="@color/yellow"
	                        android:textSize="18sp"
	                        android:text="计次"/>
                    
                    </RelativeLayout>
                    
                </LinearLayout>
                
            </RelativeLayout>
	        
            <LinearLayout 
                android:layout_weight="2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">
                
                <ListView 
                    android:id="@+id/lst_cal"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginLeft="15dp"
                    android:overScrollMode="never"
                    android:divider="@null"></ListView>
                
            </LinearLayout>
            
	    </LinearLayout>
        
    </LinearLayout>
    
    

</LinearLayout>

启动时

计次功能

复位后便全部清零

功能实现代码

package com.example.stopwatch;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class StopWatchActivity extends Activity {
	
	private TextView tv_timemain,tv_times;
	private TextView tv_set,tv_cal;
	private RoundImageView rimg_set;
	private ImageView img_cal;
	private ListView lst_cal;
	private RelativeLayout rl_cal;
	
	private TimeAdapter adapter;
	
	private boolean isStart;
	private int time = 0;
	private int flag_time = 0;
	private List<String> list = new ArrayList<String>();
	private List<String> list2 = new ArrayList<String>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_stopwatch);
		
		findView();
	}

	private void findView() {
		tv_timemain = (TextView) findViewById(R.id.tv_timemain);
		tv_times = (TextView) findViewById(R.id.tv_times);
		tv_set = (TextView) findViewById(R.id.tv_set);
		tv_cal = (TextView) findViewById(R.id.tv_cal);
		rimg_set = (RoundImageView) findViewById(R.id.rimg_set);
		img_cal = (ImageView) findViewById(R.id.img_cal);
		lst_cal = (ListView) findViewById(R.id.lst_cal);
		rl_cal = (RelativeLayout) findViewById(R.id.rl_cal);

		rimg_set.setOnClickListener(new myOnclick());
		img_cal.setOnClickListener(new myOnclick());

		img_cal.setClickable(false);
		adapter = new TimeAdapter(getApplicationContext(), list2);
		lst_cal.setAdapter(adapter);
	}
	
	@SuppressLint("NewApi") 
	protected class myOnclick implements OnClickListener{

		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.rimg_set:
				StartOrStopTime();
				break;
			case R.id.img_cal:
				calAndStop();
				break;

			default:
				break;
			}
			
		}

		private void calAndStop() {
			if (isStart) {
				String number = new CalcDay().calTime(time - flag_time);
				list.add(number);
				list2 = new ArrayList<String>();
				for (int i = list.size() - 1; i > -1; i--) {
					list2.add(list.get(i));
				}
				flag_time = time;
			} else {
				rl_cal.setAlpha(0.7f);
				time = 0;
				flag_time = 0;
				tv_timemain.setText(new CalcDay().calTime(time));
				tv_times.setText(new CalcDay().calTime(time - flag_time));
				img_cal.setClickable(false);
				tv_cal.setText("计次");
				list = new ArrayList<String>();
				list2 = new ArrayList<String>();
			}
			adapter.updateListView(list2);
		}

		private void StartOrStopTime() {
			if (!isStart) {
				new Thread(new MyThread()).start();
				isStart = true;
				tv_set.setTextColor(getResources().getColor(R.color.red));
				tv_set.setText("停止");
				rl_cal.setAlpha(1);
				tv_cal.setText("计次");
				img_cal.setClickable(true);
			} else {
				isStart = false;
				tv_set.setTextColor(getResources().getColor(R.color.green));
				tv_set.setText("启动");
				tv_cal.setText("复位");
			}
		}
		
	}
	
	private static final int T_start = 1;
	public class MyThread implements Runnable{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while (true) {
				if(!isStart){
					break;
				}
				try {
					Thread.sleep(10);
					time += 1;
					Message message = new Message();
					message.what = T_start;
					handler.sendMessage(message);//发送消息
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	@SuppressLint("HandlerLeak") 
	Handler handler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			
			switch (msg.what) {
			case T_start:
				tv_timemain.setText(new CalcDay().calTime(time));
				tv_times.setText(new CalcDay().calTime(time - flag_time));
				break;

			default:
				break;
			}
			super.handleMessage(msg);						
		}
		
		
	};

		
}

其中秒表启动后,每10毫秒刷新一次。

毫秒与文字转换代码

package com.example.stopwatch;

public class CalcDay {
	
	public String calTime(int time) {
		int millisec = time % 100 ;
		int sec = (time % 6000) / 100;
		int min = time / 6000;
		if(min >= 60){
			min %= 60;
		}
		String runningtime = null;
		String r_sec;
		String r_min;
		String r_milli;
		if(sec < 10){
			r_sec = "0" + sec;
		}else{
			r_sec = sec + "";
		}
		if(min < 10){
			r_min = "0" + min;
		}else{
			r_min = min + "";
		}
		if(millisec < 10){
			r_milli = "0" + millisec;
		}else{
			r_milli = millisec + "";
		}
		runningtime = r_min + ":" + r_sec + "." + r_milli;
		return runningtime;
	}
}

计次时,用到的适配器,因为iphone上计次是倒着显示的,所以我们这里也得做相应的调整

package com.example.stopwatch;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class TimeAdapter extends BaseAdapter {

	private List<String> list = null;
	private Context mContext;
	
	public TimeAdapter(Context mContext, List<String> list) {
		this.mContext = mContext;
		this.list = list;
	}
	public void updateListView(List<String> list){
		this.list = list;
		notifyDataSetChanged();
	}
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return this.list.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return this.list.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder viewHolder = null;
		if (convertView == null) {
			viewHolder = new ViewHolder();
			convertView = LayoutInflater.from(mContext).inflate(R.layout.time_item, null);
			viewHolder.tv_number = (TextView) convertView.findViewById(R.id.tv_number);	
			viewHolder.tv_time = (TextView) convertView.findViewById(R.id.tv_time);	
			convertView.setTag(viewHolder);
		} else {
			viewHolder = (ViewHolder) convertView.getTag();
		}
		viewHolder.tv_number.setText("计次" + (list.size() - position));
		viewHolder.tv_time.setText(list.get(position));
		
		return convertView;
	}
	
	final static class ViewHolder {
		TextView tv_number;
		TextView tv_time;
	}

}

示例

http://download.csdn.net/detail/u013898922/8417283

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值