最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 自定義View實現(xiàn)計時文字詳解

 更新時間:2023年04月26日 08:56:15   作者:初學者_Study  
這篇文章主要為大家介紹了Android 自定義View實現(xiàn)計時文字詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

  在Android開發(fā)中,常常會有計時的一些操作,例如收驗證碼的時候倒計時,秒表的計時等等,于是我就有了一個寫自定義View的想法,本文效果圖。

  那么現(xiàn)在我們將想法換成現(xiàn)實,這個自定義View比較簡單,我們來看怎么寫的,首先我們還是在EasyView中進行添加。

一、XML樣式

  根據(jù)上面的效果圖,我們首先來確定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,一種是繼承現(xiàn)有的View,還有一種是繼承ViewGroup,那么今天的這個計時文字,我們就可以繼承現(xiàn)有的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();
    }
}

  因為有計時的緣故,所以我們需要一個計時監(jiān)聽,主要用于結束的時候進行調用,可以在com.llw.easyview下新建一個TimingListener接口,代碼如下:

public interface TimingListener {
    void onEnd();
}

三、API方法

下面在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("停止");
            }
        });

下面運行一下看看:

五、源碼

如果對你有所幫助的話,不妨 Star 或 Fork,山高水長,后會有期~

源碼地址:EasyView

以上就是Android 自定義View實現(xiàn)計時文字詳解的詳細內容,更多關于Android 自定義View計時文字的資料請關注腳本之家其它相關文章!

相關文章

  • Android實現(xiàn)截屏并保存操作功能

    Android實現(xiàn)截屏并保存操作功能

    這篇文章主要介紹了Android實現(xiàn)截屏操作功能,即Android中截取當前屏幕的功能,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 新浪微博第三方登錄界面上下拉伸圖片之第三方開源PullToZoomListViewEx(二)

    新浪微博第三方登錄界面上下拉伸圖片之第三方開源PullToZoomListViewEx(二)

    這篇文章主要介紹了新浪微博第三方登錄界面上下拉伸圖片之第三方開源PullToZoomListViewEx(二) 的相關資料,需要的朋友可以參考下
    2015-12-12
  • Android基礎之常用控件屬性介紹

    Android基礎之常用控件屬性介紹

    大家好,本篇文章主要講的是Android基礎之常用控件屬性介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Android 懸浮窗權限各機型各系統(tǒng)適配大全(總結)

    Android 懸浮窗權限各機型各系統(tǒng)適配大全(總結)

    這篇文章主要介紹了Android 懸浮窗權限各機型各系統(tǒng)適配大全(總結),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android簡單封裝一個MVP基類流程詳解

    Android簡單封裝一個MVP基類流程詳解

    MVP是從經(jīng)典的模式MVC演變而來,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供數(shù)據(jù),View負責顯示。下面這篇文章主要給大家介紹了關于Android從實現(xiàn)到封裝MVP的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧
    2023-03-03
  • JNI方法實現(xiàn)圖片壓縮(壓縮率極高)

    JNI方法實現(xiàn)圖片壓縮(壓縮率極高)

    這篇文章主要給大家介紹了一種JNI方法實現(xiàn)圖片壓縮(壓縮率極高)的相關資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Android Retrofit2數(shù)據(jù)解析代碼解析

    Android Retrofit2數(shù)據(jù)解析代碼解析

    這篇文章主要介紹了Android Retrofit2數(shù)據(jù)解析代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • Android APK反編譯技巧深入講解

    Android APK反編譯技巧深入講解

    這篇文章主要給大家介紹了關于Android APK反編譯技巧的相關資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Android使用Retrofit實現(xiàn)自定義Converter解析接口流程詳解

    Android使用Retrofit實現(xiàn)自定義Converter解析接口流程詳解

    Retrofit是一個RESTful的HTTP網(wǎng)絡請求框架的封裝,網(wǎng)絡請求的工作本質上是OkHttp完成,而Retrofit僅負責網(wǎng)絡請求接口的封裝
    2023-03-03
  • Android發(fā)生ANR后的信息采集過程

    Android發(fā)生ANR后的信息采集過程

    這篇文章主要為大家介紹了Android發(fā)生ANR后的信息采集過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07

最新評論

茌平县| 广河县| 衡阳市| 油尖旺区| 洛宁县| 靖远县| 宁明县| 资溪县| 文水县| 新余市| 大港区| 东方市| 纳雍县| 凌源市| 锦州市| 德令哈市| 洪泽县| 房山区| 广州市| 岳阳市| 盐边县| 克什克腾旗| 大港区| 祁门县| 喀什市| 湖口县| 丁青县| 海兴县| 青神县| 商城县| 拉萨市| 海晏县| 淮南市| 翁源县| 河曲县| 绥阳县| 马关县| 浪卡子县| 西昌市| 定陶县| 湘阴县|