需求很简单,传入一个点击按钮,点击可实现倒计时功能,并且可以重复倒计时,使用自定义View的方式,在自定义VIew方法中传入被点击的View对象,用于控制倒计时的开始开关。描述可能有些琐碎,直接上代码了。
首先是一个自定义view的java代码文件,继承自linearlayout
/**
* Created by xiedong on 2017/3/9.
*/
public class CountDownView extends LinearLayout implements View.OnClickListener {
private Context mContext;
private LinearLayout mLLConutdownView;
private TextView mCountdownView;
private TextView bindView; //被绑定的view
private CountDownTimer mCountDownTimer = new CountDownTimer(10*1000 , 1000) {
@Override
public void onTick(long millisUntilFinished) {
mCountdownView.setText(millisUntilFinished / 1000 +"");
}
@Override
public void onFinish() {
mCountdownView.setText("倒计时完成");
bindView.setClickable(true);
bindView.setBackgroundColor(Color.RED);
}
};
public CountDownView(Context context) {
super(context);
this.mContext = context;
initView();
}
public CountDownView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
initView();
}
public CountDownView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
initView();
}
private void initView() {
View view = View.inflate(mContext, R.layout.countdown_view,this); // 添加进容器
mLLConutdownView = ((LinearLayout) findViewById(R.id.ll_countdown_view));
mCountdownView = (TextView) findViewById(R.id.tv_countdown_view);
mCountdownView.setOnClickListener(this);
}
public CountDownView bindCountdown2View(View view){
this.bindView = (TextView) view;
bindView.setOnClickListener(this);
return this;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bind_view :
mCountDownTimer.start();
bindView.setClickable(false);
bindView.setBackgroundColor(Color.WHITE);
break;
}
}
}
<?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:id="@+id/ll_countdown_view"
android:orientation="vertical"
android:gravity="center">
<TextView
android:textSize="22sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_countdown_view"
android:gravity="center"
android:text="22222"
/>
</LinearLayout>
在主布局中引入该自定义view
public class MainActivity extends AppCompatActivity {
private TextView bindView;
private CountDownView countDownView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindView = (TextView) findViewById(R.id.bind_view);
countDownView = new CountDownView(this);
countDownView.bindCountdown2View(bindView);
addContentView(countDownView,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.project.MainActivity">
<TextView
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bind_view"
android:layout_centerHorizontal="true"
android:text="开始倒计时"
android:textSize="20sp"
android:padding="20dp"
/>
<!--<com.example.project.view.CountDownView-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"/>-->
</RelativeLayout>
自定义view一般有两种引入方式,可以在java代码中直接new出来,也可以在布局文件中直接添加,由于上述例子中需要把倒计时的视图绑定到一个可控制它的View上,所以需要在java代码中new,大家具体需求可根据自己的项目需求自行更改,代码示例仅供参考。