您的位置:首页 > 移动开发 > Android开发

Android 绘制计时器

2015-08-05 12:32 357 查看
用小米的手机,发现其实还可以,无意间点开小米的计时器,发现界面非常好看和实用。于是自己仿照着写一个,由于技术不好,代码整体结构上可能有点乱,但主要的实现功能和掌握知识点。

Android中绘制采用canvase绘图类,加上timer计时器和handler来更新UI,核心就这点东西,非常简单。废话不多说,先附上效果图。

package com.example.timer;

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

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;

public class MainActivity extends Activity {
private ListView listview;
private Button btnStart, btnJici, btnStop;
private LinearLayout lin, linView;
MyCanvases myCanvases;
List<String> list;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = new ArrayList<String>();
intview();
}

/**
* 获得控件关联,为按钮设置监听
*/
private void intview() {
linView = (LinearLayout) findViewById(R.id.main_view);
listview = (ListView) findViewById(R.id.main_listview);
btnStart = (Button) findViewById(R.id.main_button_start);
btnStart.setOnClickListener(new MyOnClick());
btnJici = (Button) findViewById(R.id.main_button_jici);
btnJici.setOnClickListener(new MyOnClick());
btnStop = (Button) findViewById(R.id.main_button_zanting);
btnStop.setOnClickListener(new MyOnClick());
lin = (LinearLayout) findViewById(R.id.main_lin);
}

/**
* 实现点击事件接口,用控件id来区分不同事件,将所有事件集中到一起处理。(个人比较喜欢这样写)
*
* @author
*
*/
public class MyOnClick implements OnClickListener {

public void onClick(View v) {
switch (v.getId()) {
case R.id.main_button_start:
myCanvases.Start();
btnStart.setVisibility(View.GONE);
lin.setVisibility(View.VISIBLE);
break;
case R.id.main_button_zanting:
if (btnStop.getText().toString().equals("暂停")) {
myCanvases.Stop();
btnStop.setText("继续");
btnJici.setText("重置");
} else {
myCanvases.Start();
btnStop.setText("暂停");
btnJici.setText("记次");
}
break;
case R.id.main_button_jici:
if (btnJici.getText().toString().equals("重置")) {
myCanvases.setTime();
btnStart.setVisibility(View.VISIBLE);
lin.setVisibility(View.GONE);
btnStop.setText("暂停");
btnJici.setText("记次");
// 清空数据
list.clear();
// 清空listview
listview.setAdapter(null);
} else {
// 添加数据
list.add(myCanvases.getTime());
String[] text = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
text[i] = "第" + (i + 1) + "次:               "
+ list.get(i);
}
// 建立适配器
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
MainActivity.this,
android.R.layout.simple_list_item_1, text);
// 添加适配器
listview.setAdapter(adapter);
// 将listview的焦点始终锁定在最后一行,很有用
listview.setSelection(adapter.getCount());
}
default:
break;
}
}
}

// 重写activit的onWindowFocusChanged方法,是为了在布局加载完成之后,
// 才能获得到控件的大小和位置,将参数传递到绘图类
public void onWindowFocusChanged(boolean hasFocus) {
if (hasFocus) {
myCanvases = new MyCanvases(this, linView.getWidth(),
linView.getHeight());
//将绘制的图像加载到对应的布局上显示
linView.addView(myCanvases);
}
}
}


MainActivity

最后说一些细节。在绘制的坐标问题上,我先是在activity布局加载完成之后,将绘制区域的宽度和高度获取到,根据这个数据来绘制,本来是想实现在不同手机屏幕实现自适应效果,后来发现。手机分辨率不一样的时候,还是没能实现,所以大家根据自己的需要改改坐标。至于怎么实现自适应屏幕,由于没有系统的学习过,现在还是没有解决好。我会努力的。还有就是小米自带计时器上有渲染的效果,就是指针转动时颜色会发生变化,这个用android自带的绘图渲染来写很麻烦。所以可能是用第三方包,这里我就不写了(试着写过,但是渲染效果很差,就删除了)。

大家有什么意见,欢迎随时交流。大神勿喷....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: