需求很简单,传入一个点击按钮,点击可实现倒计时功能,并且可以重复倒计时,使用自定义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; } } }填充自定义view的布局文件 <?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)); } }
主布局的layout文件 <?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,大家具体需求可根据自己的项目需求自行更改,代码示例仅供参考。
