【Android、IOS、Flutter、鸿蒙、ReactNative 】倒计时

1,558 阅读3分钟

Android Java 倒计时

自定义倒计时 参考倒计时跳秒情况

import android.os.CountDownTimer;
import android.util.Log;
public class MyCountDownTimer extends CountDownTimer {

    private ICountDownCallBack iCountDownCallBack;

    public MyCountDownTimer(long millisInFuture,
                            long countDownInterval,
                            ICountDownCallBack countDownCallBack) {
        super(millisInFuture, countDownInterval);
        this.iCountDownCallBack = countDownCallBack;
    }

    @Override
    public void onTick(long millisUntilFinished) {
        // 这里每隔countDownInterval毫秒调用一次
        long countDownTime = millisUntilFinished / 1000;
        // 可以在这里更新UI,显示剩余时间
        Log.i("CountDownTimer", "seconds remaining: " + millisUntilFinished +"__"+countDownTime);
        iCountDownCallBack.countDownResult(countDownTime);
    }

    @Override
    public void onFinish() {
        // 倒计时完成时调用
        Log.d("CountDownTimer", "Countdown finished!");
        iCountDownCallBack.countDownFinish();
    }

    public interface ICountDownCallBack {
        void countDownResult(long countDownTime);

        void countDownFinish();
    }
}

使用倒计时

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private MyCountDownTimer myCountDownTimer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initCountDown();
    }


    private void initCountDown() {

        TextView tvCountDown = findViewById(R.id.tvCountDown);

        // 倒计时总时间60s
        // 每次倒计时1s
        myCountDownTimer = new MyCountDownTimer(60 * 1000 + 50, 1000, new MyCountDownTimer.ICountDownCallBack() {
            @Override
            public void countDownResult(long countDownTime) {
                tvCountDown.setClickable(false);
                tvCountDown.setText("倒计时" + countDownTime + "s");
            }

            @Override
            public void countDownFinish() {
                tvCountDown.setClickable(true);
                tvCountDown.setText("60s倒计时结束");
            }
        });

        tvCountDown.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myCountDownTimer.start();
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消倒计时任务
        myCountDownTimer.cancel();
    }
}

image.png

Android Kotlin 倒计时

自定义倒计时

import android.os.CountDownTimer
import android.util.Log

class MyCountDownTimer(
    millisInFuture: Long,
    countDownInterval: Long,
    private val iCountDownCallBack: ICountDownCallBack
) : CountDownTimer(millisInFuture, countDownInterval) {
    override fun onTick(millisUntilFinished: Long) {
        // 这里每隔countDownInterval毫秒调用一次
        val countDownTime = millisUntilFinished / 1000
        // 可以在这里更新UI,显示剩余时间
        Log.i("CountDownTimer", "seconds remaining: " + millisUntilFinished + "__" + countDownTime)
        iCountDownCallBack.countDownResult(countDownTime)
    }

    override fun onFinish() {
        // 倒计时完成时调用
        Log.d("CountDownTimer", "Countdown finished!")
        iCountDownCallBack.countDownFinish()
    }

    interface ICountDownCallBack {
        fun countDownResult(countDownTime: Long)
        fun countDownFinish()
    }
}

使用倒计时

import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    private var myCountDownTimer: MyCountDownTimer? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initCountDown()
    }

    private fun initCountDown() {
        val tvCountDown = findViewById<TextView>(R.id.tvCountDown)

        // 倒计时总时间60s
        // 每次倒计时1s
        myCountDownTimer = MyCountDownTimer(60 * 1000 + 50, 1000, object :
            MyCountDownTimer.ICountDownCallBack {
            override fun countDownResult(countDownTime: Long) {
                tvCountDown.isClickable = false
                tvCountDown.text = "倒计时" + countDownTime + "s"
            }

            override fun countDownFinish() {
                tvCountDown.isClickable = true
                tvCountDown.text = "60s倒计时结束"
            }
        })
        tvCountDown.setOnClickListener { myCountDownTimer!!.start() }
    }

    override fun onDestroy() {
        super.onDestroy()
        // 取消倒计时任务
        myCountDownTimer!!.cancel()
    }

}

IOS Object-c 倒计时

定义倒计时需要的常量、变量

image.png

定义倒计时函数

image.png

开始并显示倒计时

image.png

image.png

image.png

IOS Swift 倒计时

定义倒计时需要的常量、变量

image.png

定义倒计时函数

image.png

开始并显示倒计时

image.png

image.png

image.png

Flutter 倒计时

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Timer? _timer;
  int _countDownTime = 60; // 倒计时总时间

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
          child: GestureDetector(
        onTap: () {
          _startCountDown();
        },
        child: Container(
          width: 220.0,
          height: 50.0,
          color: Colors.orange,
          alignment: Alignment.center,
          child: Text(
            (_countDownTime < 60) ? '倒计时$_countDownTime s' : 'Flutter 倒计时60s',
            style: const TextStyle(color: Colors.white),
          ),
        ),
      )),
    );
  }

  // 开始倒计时
  void _startCountDown() {
    if (_countDownTime < 60) return;
    // 重复执行
    _timer = Timer.periodic(const Duration(seconds: 1), (Timer t) {
      _countDownTime--;
      // 这里的代码会每1秒执行一次
      if (kDebugMode) {
        print('当前倒计时的时间:$_countDownTime');
      }
      setState(() {});
      if (_countDownTime == 1) {
        _timer?.cancel();
        _countDownTime = 60;
      }
    });
  }

  @override
  void dispose() {
    super.dispose();
    _timer?.cancel();
    _timer = null;
  }
}

image.png

鸿蒙 倒计时

@Entry
@Component
struct Index {
  @State message: string = '鸿蒙 60s倒计时'
  @State count: number = 60
  timer: number = -1
  flagTimer: boolean = false

  build() {
    Flex({
      alignItems: ItemAlign.Center, //垂直居中
      justifyContent: FlexAlign.Center, //水平居中
    }) {
      Text(this.message)
        .fontSize(28) // 字体大小
        .fontWeight(FontWeight.Bold) // 字体粗细
        .textAlign(TextAlign.Center) // 文本居中
        .backgroundColor(Color.Orange) //背景颜色
        .fontColor(Color.White) // 字体颜色
        .onClick(() => { // 点击事件
          if (this.flagTimer) {
            return
          }
          this.flagTimer = true
          this.timer = setInterval(() => {
            if (this.count == 0) {
              clearInterval(this.timer)
              this.count = 5
              this.flagTimer = false
              this.message = "鸿蒙 60s倒计时"
              return;
            }
            this.count--
            this.message = "倒计时 " + this.count + " s"
            console.log(this.message)
          }, 1000)
        })
        .height(80)
        .width('80%') // 宽、高
    }.width('100%').height('100%')
  }

  aboutToDisappear(){
    // 倒计时结束,清除计时器
    clearInterval(this.timer)
  }

}

image.png

ReactNative 倒计时

import React, { useState, useEffect } from 'react';
import { Text, TouchableOpacity, StyleSheet,AppRegistry } from 'react-native';
import App from './App';
import {name as appName} from './app.json';

const CountdownButton = ({ seconds, onTimeElapsed }) => {

  // useState React的Hook函数
  // 用于在函数组件中添加状态
  // 用来获取先前状态的数据
  const [count, setCount] = useState(seconds);

  useEffect(() => {
    let interval = null;
    if (count > 0) {
      // 倒计时进行中
      interval = setInterval(() => {
        setCount(prevCount => prevCount - 1);
      }, 1000);
    } else if (count === 0) {
      onTimeElapsed();
      clearInterval(interval);//清除倒计时
    }
    return () => clearInterval(interval);
  }, [count, onTimeElapsed]);

  const handlePress = () => {
    // 当倒计时时间为0时可以重新触发倒计时
    if(count==0){
        setCount(60);
    }
  };

  return (
    <TouchableOpacity onPress={handlePress} style={styles.opacity}>
<Text style={styles.text}>{count <= 0 ? 'ReactNative 倒计时60s' : `倒计时: ${count} s`}</Text>
    </TouchableOpacity>
  );
};

const styles = StyleSheet.create({
  text: {
    width:'100%', // 宽度
    height:60, // 高度
    textAlign: 'center', // 水平居中
    backgroundColor: '#ffcc00', // 设置背景颜色
    textAlignVertical: 'center', // 垂直居中
  },
    opacity:{
      justifyContent: 'center',
      alignItems: 'center',
      width:'100%', // 宽度
      height:'100%', // 高度
      paddingLeft: '5%',
      paddingRight: '5%',
    },
});

const textClick = () => {
  return (
    <CountdownButton seconds={0} onTimeElapsed={() => console.log('Countdown finished')} />
  );
};

AppRegistry.registerComponent(appName, () => textClick);

案例

切换到分支 flutter_count_down

image.png