这一次,我倾尽所有,换你一世陪伴。
今天要介绍的是CheckedTextView、Chronometer、DigitalClock这三个类。源码很简单,继承自TextView。
代码主要有四个,依次给出代码。最后一个是自定义控件,DigitalClock,我为了省劲类名直接用原类名,不建议这样。
- MainActivity.java
package com.im.wu.textviewremainpractice;
import android.graphics.drawable.Drawable;
import android.os.SystemClock;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.Chronometer;
public class MainActivity extends AppCompatActivity {
private CheckedTextView checkedTextView1;
private CheckedTextView checkedTextView2;
private CheckedTextView checkedTextView3;
private Chronometer chronometer;
private Button btn_start;
private Button btn_stop;
private Button btn_base;
private Button btn_format;
private Vibrator vibrator;//震动服务
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkedTextView1=(CheckedTextView)findViewById(R.id.checkedTextView1);
checkedTextView2=(CheckedTextView)findViewById(R.id.checkedTextView2);
checkedTextView3=(CheckedTextView)findViewById(R.id.checkedTextView3);
btn_start = (Button) findViewById(R.id.btn_start);
btn_stop = (Button) findViewById(R.id.btn_stop);
btn_base = (Button) findViewById(R.id.btn_base);
btn_format = (Button) findViewById(R.id.btn_format);
btn_start.setOnClickListener(new ButtonClickListener());
btn_stop.setOnClickListener(new ButtonClickListener());
btn_base.setOnClickListener(new ButtonClickListener());
btn_format.setOnClickListener(new ButtonClickListener());
chronometer = (Chronometer) findViewById(R.id.chronometer);
chronometer.setFormat("计时时间:(%s)");
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);// 获取震动服务
chronometer = (Chronometer) findViewById(R.id.chronometer);
chronometer
.setOnChronometerTickListener(new OnChronometerTickListenerImpl());
//设置checkedTextView1为选中状态
checkedTextView1.setChecked(true);
//设置checkedTextView2的页边距,即距上/下/左/右各20像素,默认为未选中状态
checkedTextView2.setPadding(20, 20, 20, 20);
//设置checkedTextView3为选中状态,并更改其显示图标,使用android系统资源arrow_down_float
checkedTextView3.setChecked(true);
checkedTextView3.setCheckMarkDrawable(android.R.drawable.arrow_down_float);
//设置checkedTextView4反转状态,由默认的未选中反转为选中状态
checkedTextView1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
checkedTextView1.toggle();
}
});
//点击状态后变更相反,如选中变为未选中,未选中的变为选中
checkedTextView2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
checkedTextView2.toggle();
}
});
//点击状态后变更相反,即下三角转化为上三角符号
checkedTextView3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(!checkedTextView3.isChecked()){
checkedTextView3.setCheckMarkDrawable(android.R.drawable.arrow_down_float);
checkedTextView3.setChecked(true);
}else {
checkedTextView3.setCheckMarkDrawable(android.R.drawable.arrow_up_float);
checkedTextView3.setChecked(false);
}
}
});
}
public class OnChronometerTickListenerImpl implements // 计时监听事件,随时随地的监听时间的变化
Chronometer.OnChronometerTickListener {
@Override
public void onChronometerTick(Chronometer chronometer) {
String time = chronometer.getText().toString();
if ("00:05".equals(time)) {// 判断五秒之后,让手机震动
vibrator.vibrate(new long[] { 1000, 10, 100, 10 }, 0);// 设置震动周期和是否循环震动,如果不想循环震动把0改为-1
}
}
}
public class ButtonClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
chronometer.start();// 开始计时
break;
case R.id.btn_stop:
chronometer.stop();// 停止计时
break;
case R.id.btn_base:
chronometer.setBase(SystemClock.elapsedRealtime());// 复位键
break;
case R.id.btn_format:
chronometer.setFormat("显示时间:%s.");// 更改时间显示格式
break;
default:
break;
}
}
}
}
- activity_main.xml
<?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:orientation="vertical">
<CheckedTextView
android:id="@+id/checkedTextView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:text="@string/checkedTextView1"
/>
<CheckedTextView
android:id="@+id/checkedTextView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:text="@string/checkedTextView2"
/>
<CheckedTextView
android:id="@+id/checkedTextView3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:text="@string/checkedTextView3"
/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始" />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止" />
<Button
android:id="@+id/btn_base"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="复位" />
<Button
android:id="@+id/btn_format"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="格式化" />
</LinearLayout>
<Chronometer
android:id="@+id/chronometer"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<com.im.wu.textviewremainpractice.DigitalClock
android:id="@+id/DigitalClock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/darker_gray"
android:textSize="55sp"
android:shadowColor="@android:color/holo_red_dark"
android:shadowRadius="2.0"
android:layout_gravity="center_horizontal">
</com.im.wu.textviewremainpractice.DigitalClock>
</LinearLayout>
- strings.xml
<resources>
<string name="app_name">TextViewRemainPractice</string>
<string name="checkedTextView1">TextView多选框1</string>
<string name="checkedTextView2">TextView多选框2</string>
<string name="checkedTextView3">TextView多选框3</string>
</resources>
- DigitalClock.java
package com.im.wu.textviewremainpractice;
import android.content.Context;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.SystemClock;
import android.provider.Settings;
import android.text.format.DateFormat;
import android.util.AttributeSet;
import java.util.Calendar;
/**
* Created by wu on 2016/3/15.
*/
public class DigitalClock extends android.widget.DigitalClock{
Calendar mCalendar;
private final static String m12 = "h:mm aa";//h:mm:ss aa
private final static String m24 = "k:mm";//k:mm:ss
private FormatChangeObserver mFormatChangeObserver;
private Runnable mTicker;
private Handler mHandler;
private boolean mTickerStopped = false;
String mFormat;
public DigitalClock(Context context) {
super(context);
initClock(context);
}
public DigitalClock(Context context, AttributeSet attrs) {
super(context, attrs);
initClock(context);
}
private void initClock(Context context) {
Resources r = context.getResources();
if (mCalendar == null) {
mCalendar = Calendar.getInstance();
}
mFormatChangeObserver = new FormatChangeObserver();
getContext().getContentResolver().registerContentObserver(
Settings.System.CONTENT_URI, true, mFormatChangeObserver);
setFormat();
}
@Override
protected void onAttachedToWindow() {
mTickerStopped = false;
super.onAttachedToWindow();
mHandler = new Handler();
/**
* requests a tick on the next hard-second boundary
*/
mTicker = new Runnable() {
public void run() {
if (mTickerStopped) return;
mCalendar.setTimeInMillis(System.currentTimeMillis());
setText(DateFormat.format(mFormat, mCalendar));
invalidate();
long now = SystemClock.uptimeMillis();
long next = now + (1000 - now % 1000);
mHandler.postAtTime(mTicker, next);
}
};
mTicker.run();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mTickerStopped = true;
}
/**
* Pulls 12/24 mode from system settings
*/
private boolean get24HourMode() {
return android.text.format.DateFormat.is24HourFormat(getContext());
}
private void setFormat() {
if (get24HourMode()) {
mFormat = m24;
} else {
mFormat = m12;
}
}
private class FormatChangeObserver extends ContentObserver {
public FormatChangeObserver() {
super(new Handler());
}
@Override
public void onChange(boolean selfChange) {
setFormat();
}
}
}
部分内容摘自()。
- 可关注微信公众号(zhudekoudai 、smart_android)
- QQ群号: 413589216
- 专注Android分享:http://www.codernote.top/