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

Android實(shí)現(xiàn)啟動(dòng)頁倒計(jì)時(shí)效果

 更新時(shí)間:2021年04月19日 15:00:25   作者:龍旋  
這篇文章主要介紹了Android實(shí)現(xiàn)啟動(dòng)頁倒計(jì)時(shí)效果的示例代碼,幫助大家更好的理解和學(xué)習(xí)使用Android進(jìn)行開發(fā),感興趣的朋友可以了解下

今天介紹一個(gè)很簡單的倒計(jì)時(shí)動(dòng)畫,仿酷狗音樂的啟動(dòng)頁倒計(jì)時(shí)效果,也是大多數(shù)APP在用的一個(gè)動(dòng)畫,來看看效果圖:

整體的思路就是用一個(gè)平滑的幀動(dòng)畫來畫圓弧就行了。

這篇文章學(xué)到什么?

了解屬性動(dòng)畫ValueAnimator的用法

了解動(dòng)畫屬性插值Interpolator,讓動(dòng)畫過度得更自然

如何畫圓弧

開始準(zhǔn)備

新建一個(gè)類繼承TextView,因?yàn)橹虚g還有跳過的文本,所以選擇用TextView來畫個(gè)動(dòng)起來的背景圖。

/**
 * 倒計(jì)時(shí)文本
 */
@SuppressLint("AppCompatCustomView")
public class CountDownTextView extends TextView {
    // 倒計(jì)時(shí)動(dòng)畫時(shí)間
    private int duration = 5000;
    // 動(dòng)畫掃過的角度
    private int mSweepAngle = 360;
    // 屬性動(dòng)畫
    private ValueAnimator animator;
    // 矩形用來保存位置大小信息
    private final RectF mRect = new RectF();
    // 圓弧的畫筆
    private Paint mBackgroundPaint;

    public CountDownTextView(Context context) {
        this(context, null);
    }

    public CountDownTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CountDownTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

  private void init() {
        // 設(shè)置畫筆平滑
        mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        // 設(shè)置畫筆顏色
        mBackgroundPaint.setColor(Color.WHITE);
        // 設(shè)置畫筆邊框?qū)挾?
        mBackgroundPaint.setStrokeWidth(5);
        // 設(shè)置畫筆樣式為邊框類型
        mBackgroundPaint.setStyle(Paint.Style.STROKE);
    }
}

開始動(dòng)畫

原理:利用圓的360度角來做屬性動(dòng)畫,讓它平滑的分配做每幀動(dòng)畫的角度值,然后調(diào)用invalidate()來重繪自己本身,從而進(jìn)入到本身的onDraw()方法來畫圖。

    /**
     * 開始倒計(jì)時(shí)
     */
    public void start() {
        // 在動(dòng)畫中
        if (mSweepAngle != 360) return;
        //  初始化屬性動(dòng)畫
        animator = ValueAnimator.ofInt(mSweepAngle).setDuration(duration);
        // 設(shè)置插值
        animator.setInterpolator(new LinearInterpolator());
        // 設(shè)置動(dòng)畫監(jiān)聽
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                // 獲取屬性動(dòng)畫返回的動(dòng)畫值
                mSweepAngle = (int) animation.getAnimatedValue();
                // 重繪自己
                invalidate();
            }
        });

        // 開始動(dòng)畫
        animator.start();
    }

畫圓弧

畫圓弧比較簡單, 從效果圖來看,有的同學(xué)可能剛開始以為要畫兩個(gè)圓,一個(gè)背景的內(nèi)圓和一個(gè)白色邊框的大圓,其實(shí)這里可以利用畫筆設(shè)置畫筆樣式paint.setStyle()和寬度大小paint.setStrokeWidth()的特性來實(shí)現(xiàn)。代碼很簡單,開始的角度選擇-90,從頭頂開始畫。這樣實(shí)現(xiàn)的是一個(gè)順時(shí)針的倒計(jì)時(shí)效果。如果你想實(shí)現(xiàn)酷狗的逆時(shí)針效果,就控制mSweepAngle的值用mSweepAngle = 360 - mSweepAngle開始就可以了。

 @Override
    protected void onDraw(Canvas canvas) {
        int padding = dp2px(4);
        mRect.top = padding;
        mRect.left = padding;
        mRect.right = getWidth() - padding;
        mRect.bottom = getHeight() - padding;

        // 畫倒計(jì)時(shí)線內(nèi)圓
        canvas.drawArc(mRect, //弧線所使用的矩形區(qū)域大小
                -90,  //開始角度
                mSweepAngle, //掃過的角度
                false, //是否使用中心
                mBackgroundPaint); // 設(shè)置畫筆

        super.onDraw(canvas);
    }

什么是插值動(dòng)畫?

為了讓動(dòng)畫過度的更加自然或者添加一些動(dòng)畫效果,比如勻速運(yùn)動(dòng)、加速運(yùn)動(dòng)、減速運(yùn)動(dòng)、彈跳運(yùn)動(dòng)等等,這些的動(dòng)畫的效果就是靠插值來實(shí)現(xiàn)的。在Android中系統(tǒng)內(nèi)置了一些插值,更加直觀的展示下面介紹的動(dòng)畫效果。

插值 說明
LinearInterpolator 以常量速率改變
BounceInterpolator 動(dòng)畫結(jié)束的時(shí)候彈起
CycleInterpolator 動(dòng)畫循環(huán)播放特定的次數(shù),速率改變沿著正弦曲線
DecelerateInterpolator 在動(dòng)畫開始的地方快然后慢
OvershootInterpolator 向前甩一定值后再回到原來位置
AccelerateInterpolator 在動(dòng)畫開始的地方速率改變比較慢,然后開始加速
AnticipateInterpolator 開始的時(shí)候向后然后向前甩
AccelerateDecelerateInterpolator 在動(dòng)畫開始與介紹的地方速率改變比較慢,在中間的時(shí)候加速
AnticipateOvershootInterpolator 開始的時(shí)候向后然后向前甩一定值后返回最后的值

項(xiàng)目使用

這里要定義文本的寬高,因?yàn)闆]有畫底部的黑色圓背景,還要設(shè)置一下背景圖。

 <com.example.viewdemo.CountDownTextView
        android:id="@+id/tv_skip"
        style="@style/Widget.AppCompat.Button.Borderless"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center"
        android:background="@drawable/bg_count_down"
        android:text="跳過"
        android:textColor="#ffffff"
        android:textSize="12sp"
        android:visibility="visible" />

背景圖

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="oval">
            <solid android:color="#302d2d2d" />
        </shape>
    </item>
    <item>
        <shape android:shape="oval">
            <solid android:color="#7F2d2d2d" />
        </shape>
    </item>
</selector>

完整代碼

/**
 * 倒計(jì)時(shí)文本
 */
@SuppressLint("AppCompatCustomView")
public class CountDownTextView extends TextView {
    // 倒計(jì)時(shí)動(dòng)畫時(shí)間
    private int duration = 5000;
    // 動(dòng)畫掃過的角度
    private int mSweepAngle = 360;
    // 屬性動(dòng)畫
    private ValueAnimator animator;
    // 矩形用來保存位置大小信息
    private final RectF mRect = new RectF();
    // 圓弧的畫筆
    private Paint mBackgroundPaint;

    public CountDownTextView(Context context) {
        this(context, null);
    }

    public CountDownTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CountDownTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        init();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int padding = 5;
        mRect.top = padding;
        mRect.left = padding;
        mRect.right = getWidth() - padding;
        mRect.bottom = getHeight() - padding;

        // 畫倒計(jì)時(shí)線內(nèi)圓
        canvas.drawArc(mRect, //弧線所使用的矩形區(qū)域大小
                -90,  //開始角度
                mSweepAngle, //掃過的角度
                false, //是否使用中心
                mBackgroundPaint); // 設(shè)置畫筆

        start();

        super.onDraw(canvas);
    }

    private void init() {
        // 設(shè)置畫筆平滑
        mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        // 設(shè)置畫筆顏色
        mBackgroundPaint.setColor(Color.WHITE);
        // 設(shè)置畫筆邊框?qū)挾?
        mBackgroundPaint.setStrokeWidth(5);
        // 設(shè)置畫筆樣式為邊框類型
        mBackgroundPaint.setStyle(Paint.Style.STROKE);
    }
    /**
     * 開始倒計(jì)時(shí)
     */
    public void start() {
        // 在動(dòng)畫中
        if (mSweepAngle != 360) return;
        //  初始化屬性動(dòng)畫
        animator = ValueAnimator.ofInt(mSweepAngle).setDuration(duration);
        // 設(shè)置插值
        animator.setInterpolator(new LinearInterpolator());
        // 設(shè)置動(dòng)畫監(jiān)聽
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                // 獲取屬性動(dòng)畫返回的動(dòng)畫值
                mSweepAngle = (int) animation.getAnimatedValue();
                // 重繪自己
                invalidate();
            }
        });

        // 開始動(dòng)畫
        animator.start();
    }
}

以上就是Android實(shí)現(xiàn)啟動(dòng)頁倒計(jì)時(shí)效果的詳細(xì)內(nèi)容,更多關(guān)于Android 啟動(dòng)頁倒計(jì)時(shí)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android編程之include文件的使用方法

    Android編程之include文件的使用方法

    這篇文章主要介紹了Android編程之include文件的使用方法,實(shí)例分析了Android使用include引入文件的技巧,有助于增加代碼的重用性,提高程序設(shè)計(jì)效率,需要的朋友可以參考下
    2016-01-01
  • 開箱即用的Google與百度定位坐標(biāo)系轉(zhuǎn)換實(shí)例

    開箱即用的Google與百度定位坐標(biāo)系轉(zhuǎn)換實(shí)例

    這篇文章主要為大家介紹了開箱即用的Google與百度定位坐標(biāo)系轉(zhuǎn)換實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Android中通過外部程序啟動(dòng)App的三種方法

    Android中通過外部程序啟動(dòng)App的三種方法

    這篇文章主要介紹了Android中通過外部程序啟動(dòng)App的三種方法,本文講解了直接通過包名、通過自定義的Action、通過Scheme三種方法,并分別給出操作代碼,需要的朋友可以參考下
    2015-04-04
  • Android RecyclerView選擇多個(gè)item的實(shí)現(xiàn)代碼

    Android RecyclerView選擇多個(gè)item的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Android RecyclerView選擇多個(gè)item的實(shí)現(xiàn)代碼,仿網(wǎng)易新聞客戶端頻道選擇效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Kotlin HttpURLConnection與服務(wù)器交互實(shí)現(xiàn)方法詳解

    Kotlin HttpURLConnection與服務(wù)器交互實(shí)現(xiàn)方法詳解

    簡單來說,HttpURLConnection 是發(fā)起HTTP請求的基礎(chǔ)類庫,提供了HTTP請求的基本功能,不過封裝的比較少,在使用時(shí)很多內(nèi)容都需要自己設(shè)置,也需要自己處理請求流和響應(yīng)流
    2022-09-09
  • Android ViewPager畫廊效果詳解及實(shí)例

    Android ViewPager畫廊效果詳解及實(shí)例

    這篇文章主要介紹了Android ViewPager畫廊效果詳解及實(shí)例的相關(guān)資料,這里提供實(shí)例代碼及實(shí)現(xiàn)效果圖,具有參考價(jià)值,需要的朋友可以參考下
    2016-12-12
  • Flutter 使用Navigator進(jìn)行局部跳轉(zhuǎn)頁面的方法

    Flutter 使用Navigator進(jìn)行局部跳轉(zhuǎn)頁面的方法

    這篇文章主要介紹了Flutter 使用Navigator進(jìn)行局部跳轉(zhuǎn)頁面的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Android自定義垂直拖動(dòng)seekbar進(jìn)度條

    Android自定義垂直拖動(dòng)seekbar進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Android自定義垂直拖動(dòng)seekbar進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • android開機(jī)自啟動(dòng)app示例分享

    android開機(jī)自啟動(dòng)app示例分享

    這篇文章主要介紹了android開機(jī)自動(dòng)啟動(dòng)APP的方法,大家參考使用吧
    2014-01-01
  • Android Fragment 的使用小結(jié)

    Android Fragment 的使用小結(jié)

    Fragment是Android 應(yīng)用開發(fā)中的重要組件,它代表 Activity 中的一部分 UI 或行為,可以組合多個(gè) Fragment 在一個(gè) Activity 中構(gòu)建多窗格 UI,并在不同 Activity 中重復(fù)使用某個(gè) Fragment,本文給大家介紹Android Fragment 使用,感興趣的朋友一起看看吧
    2025-04-04

最新評論

长沙市| 西贡区| 峡江县| 库尔勒市| 海伦市| 奉化市| 晴隆县| 池州市| 介休市| 库车县| 富顺县| 保亭| 雷波县| 浦东新区| 池州市| 蓝田县| 临高县| 类乌齐县| 增城市| 青冈县| 雅安市| 南华县| 谷城县| 咸阳市| 岑溪市| 广汉市| 西乌珠穆沁旗| 色达县| 科尔| 浦县| 涟水县| 文水县| 黔江区| 黄骅市| 盈江县| 上杭县| 古蔺县| 新巴尔虎左旗| 石屏县| 石柱| 博罗县|