您好,登錄后才能下訂單哦!
這篇文章主要介紹了Android怎么自定義View實現計時文字的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Android怎么自定義View實現計時文字文章都會有所收獲,下面我們一起來看看吧。
首先來確定XML中的屬性樣式,在attrs.xml中增加如下代碼:
<!--計時文字--> <declare-styleable name="TimingTextView"> <!--倒計時--> <attr name="countdown" format="boolean" /> <!--時間最大值--> <attr name="max" format="integer" /> <!--時間單位,時:h,分:m,秒:s--> <attr name="unit"> <enum name="h" value="1" /> <enum name="m" value="2" /> <enum name="s" value="3" /> </attr> </declare-styleable>
這里的計時文字目前有3個屬性,第一個boolean用來確定是計時還是倒計時,第二個是最大時間,第三個是時間單位:時分秒。
之前我說自定義View有三種方式,一種是繼承View,一種是繼承現有的View,還有一種是繼承ViewGroup,那么今天的這個計時文字,我們就可以繼承現有的View,這樣做的目的就是可以讓我們減少一定的工作量,專注于功能上,下面我們在com.llw.easyview
包下新建一個TimingTextView
類,里面的代碼如下所示:
public class TimingTextView extends MaterialTextView { /** * 時間單位 */ private int mUnit; /** * 計時最大值 */ private int mMax; /** * 是否倒計時 */ private boolean mCountDown; private int mTotal; /** * 是否計時中 */ private boolean mTiming; public TimingTextView(Context context) { this(context, null); } public TimingTextView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public TimingTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); @SuppressLint("CustomViewStyleable") TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TimingTextView); mCountDown = typedArray.getBoolean(R.styleable.TimingTextView_countdown, false); mMax = typedArray.getInteger(R.styleable.TimingTextView_max, 60); mUnit = typedArray.getInt(R.styleable.TimingTextView_unit, 3); typedArray.recycle(); } }
因為有計時的緣故,所以我們需要一個計時監聽,主要用于結束的時候進行調用,可以在com.llw.easyview
下新建一個TimingListener
接口,代碼如下:
public interface TimingListener { void onEnd(); }
下面在TimingTextView中新增一些API方法和變量,首先增加變量:
private TimingListener listener; private CountDownTimer countDownTimer;
然后增加API方法:
/** * 設置時間單位 * * @param unit 1,2,3 */ public void setUnit(int unit) { if (unit <= 0 || unit > 3) { throw new IllegalArgumentException("unit value can only be between 1 and 3"); } mUnit = unit; } /** * 設置最大時間值 * * @param max 最大值 */ public void setMax(int max) { mMax = max; } /** * 設置是否為倒計時 * * @param isCountDown true or false */ public void setCountDown(boolean isCountDown) { mCountDown = isCountDown; } public void setListener(TimingListener listener) { this.listener = listener; } public boolean isTiming() { return mTiming; } /** * 開始 */ public void start() { switch (mUnit) { case 1: mTotal = mMax * 60 * 60 * 1000; break; case 2: mTotal = mMax * 60 * 1000; break; case 3: mTotal = mMax * 1000; break; } if (countDownTimer == null) { countDownTimer = new CountDownTimer(mTotal, 1000) { @Override public void onTick(long millisUntilFinished) { int time = 0; if (mCountDown) { time = (int) (millisUntilFinished / 1000); setText(String.valueOf(time)); } else { time = (int) (mTotal / 1000 - millisUntilFinished / 1000); } setText(String.valueOf(time)); } @Override public void onFinish() { //倒計時結束 end(); } }; mTiming = true; countDownTimer.start(); } } /** * 計時結束 */ public void end() { mTotal = 0; mTiming = false; countDownTimer.cancel(); countDownTimer = null; if (listener != null) { listener.onEnd(); } }
代碼還是很簡單的,你敢信,這個自定義View就寫完了,不過可能存在一些問題,我將自定義View的代碼都放到了一個library下面里,然后將這個library進行構建成aar,然后上傳到mavenCentral()
中。
  然后我們修改一下activity_main.xml,代碼如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:padding="16dp" tools:context=".MainActivity"> <com.easy.view.MacAddressEditText android:id="@+id/mac_et" android:layout_width="wrap_content" android:layout_height="wrap_content" app:boxBackgroundColor="@color/white" app:boxStrokeColor="@color/black" app:boxStrokeWidth="2dp" app:boxWidth="48dp" app:separator=":" app:textColor="@color/black" app:textSize="16sp" /> <Button android:id="@+id/btn_mac" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="獲取地址" /> <com.easy.view.CircularProgressBar android:id="@+id/cpb_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" app:maxProgress="100" app:progress="10" app:progressbarBackgroundColor="@color/purple_500" app:progressbarColor="@color/purple_200" app:radius="80dp" app:strokeWidth="16dp" app:text="10%" app:textColor="@color/teal_200" app:textSize="28sp" /> <Button android:id="@+id/btn_set_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="隨機設置進度" /> <com.easy.view.TimingTextView android:id="@+id/tv_timing" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="計時文字" android:textColor="@color/black" android:textSize="32sp" app:countdown="false" app:max="60" app:unit="s" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:gravity="center" android:orientation="vertical"> <CheckBox android:id="@+id/cb_flag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="計時" /> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="開始" /> </LinearLayout> </LinearLayout>
下面我們回到MainActivity中,在onCreate()
方法中添加如下代碼:
//計時文本操作 TimingTextView tvTiming = findViewById(R.id.tv_timing); CheckBox cbFlag = findViewById(R.id.cb_flag); Button btnStart = findViewById(R.id.btn_start); tvTiming.setListener(new TimingListener() { @Override public void onEnd() { tvTiming.setText("計時文字"); btnStart.setText("開始"); } }); cbFlag.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { cbFlag.setText(isChecked ? "倒計時" : "計時"); } }); //計時按鈕點擊 btnStart.setOnClickListener(v -> { if (tvTiming.isTiming()) { //停止計時 tvTiming.end(); btnStart.setText("開始"); } else { tvTiming.setMax(6); tvTiming.setCountDown(cbFlag.isChecked()); tvTiming.setUnit(3);//單位 秒 //開始計時 tvTiming.start(); btnStart.setText("停止"); } });
關于“Android怎么自定義View實現計時文字”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Android怎么自定義View實現計時文字”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。