亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Android中實現一個啟動頁倒計時效果

發布時間:2021-04-20 15:31:29 來源:億速云 閱讀:239 作者:Leah 欄目:開發技術

本篇文章為大家展示了怎么在Android中實現一個啟動頁倒計時效果,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

Android是什么

Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。

開始準備

新建一個類繼承TextView,因為中間還有跳過的文本,所以選擇用TextView來畫個動起來的背景圖。

/**
 * 倒計時文本
 */
@SuppressLint("AppCompatCustomView")
public class CountDownTextView extends TextView {
    // 倒計時動畫時間
    private int duration = 5000;
    // 動畫掃過的角度
    private int mSweepAngle = 360;
    // 屬性動畫
    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() {
        // 設置畫筆平滑
        mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        // 設置畫筆顏色
        mBackgroundPaint.setColor(Color.WHITE);
        // 設置畫筆邊框寬度
        mBackgroundPaint.setStrokeWidth(5);
        // 設置畫筆樣式為邊框類型
        mBackgroundPaint.setStyle(Paint.Style.STROKE);
    }
}

開始動畫

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

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

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

畫圓弧

畫圓弧比較簡單, 從效果圖來看,有的同學可能剛開始以為要畫兩個圓,一個背景的內圓和一個白色邊框的大圓,其實這里可以利用畫筆設置畫筆樣式paint.setStyle()和寬度大小paint.setStrokeWidth()的特性來實現。代碼很簡單,開始的角度選擇-90,從頭頂開始畫。這樣實現的是一個順時針的倒計時效果。如果你想實現酷狗的逆時針效果,就控制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;

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

        super.onDraw(canvas);
    }

什么是插值動畫?

為了讓動畫過度的更加自然或者添加一些動畫效果,比如勻速運動、加速運動、減速運動、彈跳運動等等,這些的動畫的效果就是靠插值來實現的。在Android中系統內置了一些插值,更加直觀的展示下面介紹的動畫效果。

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

項目使用

這里要定義文本的寬高,因為沒有畫底部的黑色圓背景,還要設置一下背景圖。

 <com.example.viewdemo.CountDownTextView
        android:id="@+id/tv_skip"
        
        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>

完整代碼

/**
 * 倒計時文本
 */
@SuppressLint("AppCompatCustomView")
public class CountDownTextView extends TextView {
    // 倒計時動畫時間
    private int duration = 5000;
    // 動畫掃過的角度
    private int mSweepAngle = 360;
    // 屬性動畫
    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;

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

        start();

        super.onDraw(canvas);
    }

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

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

上述內容就是怎么在Android中實現一個啟動頁倒計時效果,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高雄县| 民乐县| 洛南县| 大荔县| 镇宁| 米林县| 临洮县| 旬邑县| 平湖市| 佛学| 天峨县| 竹山县| 西城区| 安化县| 山丹县| 阿尔山市| 赤城县| 信丰县| 福泉市| 岚皋县| 清河县| 宣城市| 高唐县| 调兵山市| 长乐市| 河北区| 桑日县| 醴陵市| 徐州市| 高碑店市| 天峻县| 双桥区| 泰宁县| 达日县| 苍山县| 寻甸| 德化县| 镶黄旗| 陆丰市| 板桥市| 绩溪县|