电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android自定義view實現倒計時控件

瀏覽:109日期:2022-09-22 08:36:45

本文實例為大家分享了Android自定義view實現倒計時控件的具體代碼,供大家參考,具體內容如下

Android自定義view實現倒計時控件

Android自定義view實現倒計時控件

直接上代碼

自定義TextView

文字展示

public class StrokeTextView extends TextView { private TextView borderText = null;///用于描邊的TextView private Context mContext; public StrokeTextView(Context context) { super(context); mContext = context; borderText = new TextView(context); init(); } public StrokeTextView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; borderText = new TextView(context, attrs); init(); } public StrokeTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; borderText = new TextView(context, attrs, defStyle); init(); } public void init() { TextPaint tp1 = borderText.getPaint(); tp1.setStrokeWidth(12); //設置描邊寬度 tp1.setStyle(Paint.Style.STROKE);//對文字只描邊 //設置自定義字體 Typeface fromAsset = Typeface.createFromAsset(mContext.getAssets(), 'fonts/Alibaba-PuHuiTi-Heavy.ttf'); borderText.setTypeface(fromAsset, Typeface.ITALIC); //自定義字體 ITALIC斜體 borderText.setTextColor(Color.parseColor('#F46059')); //設置描邊顏色 borderText.setShadowLayer(3.0F, 2F, 2F, Color.parseColor('#ffd44042')); //設置陰影效果(投影) borderText.setGravity(getGravity()); } @Override public void setLayoutParams(ViewGroup.LayoutParams params) { super.setLayoutParams(params); borderText.setLayoutParams(params); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { CharSequence tt = borderText.getText(); //兩個TextView上的文字必須一致 if (tt == null || !tt.equals(this.getText())) { borderText.setText(getText()); this.postInvalidate(); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); borderText.measure(widthMeasureSpec, heightMeasureSpec); } protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); borderText.layout(left, top, right, bottom); } @Override protected void onDraw(Canvas canvas) { borderText.draw(canvas); super.onDraw(canvas); }}

xml

<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:background='#F3B243' android:layout_height='match_parent' tools:context='.countdown.TestCountActivity'> <RelativeLayout android:layout_width='match_parent' android:layout_height='wrap_content'> <com.xiao.test.countdown.StrokeTextView android:layout_marginTop='100dp' android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:background='@drawable/play_advertising_timer_bg' android:paddingLeft='15dp' android:textColor='#FFFFFF' android:textSize='33sp' android:layout_centerHorizontal='true' android:layout_gravity='center' android:gravity='center_vertical' android:textStyle='italic' android:typeface='monospace' tools:ignore='RtlSymmetry' android:paddingStart='15dp' /> </RelativeLayout></LinearLayout>

倒計時幫助類

public class CountDownHelper { private OnCountDownListener onCountDownListener; private Disposable disposable; private long remainingTime; public CountDownHelper(long remainingTime) { this.remainingTime = remainingTime; } /** * 回收倒計時 */ public void destory() { if (disposable != null && !disposable.isDisposed()) { disposable.dispose(); } } /** * 開始倒計時 */ public void startCompute() { Observable.interval(1, TimeUnit.SECONDS) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Long>() { @Override public void onSubscribe(Disposable d) { disposable = d; } @Override public void onNext(Long aLong) { if (onCountDownListener == null) { return; } remainingTime -= 1000; if (remainingTime > 0) { int day = (int) (remainingTime / (1000 * 60 * 60 * 24)); int hour = (int) ((remainingTime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); int minute = (int) ((remainingTime % (1000 * 60 * 60)) / (1000 * 60)); int second = (int) ((remainingTime % (1000 * 60)) / 1000); String dayStr = day >= 10 ? String.valueOf(day) : '0' + day; String hourStr = hour >= 10 ? String.valueOf(hour) : '0' + hour; String minuteStr = minute >= 10 ? String.valueOf(minute) : '0' + minute; String secondStr = second >= 10 ? String.valueOf(second) : '0' + second; onCountDownListener.countDown(dayStr, hourStr, minuteStr, secondStr); if (remainingTime <= 0) {onCountDownListener.countDownFinish();if (disposable != null && !disposable.isDisposed()) { disposable.dispose();} } } else { onCountDownListener.countDownFinish(); if (disposable != null && !disposable.isDisposed()) {disposable.dispose(); } } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } /** * 設置倒計時回調監聽 * * @param onCountDownListener 倒計時監聽 */ public void setOnCountDownListener(OnCountDownListener onCountDownListener) { this.onCountDownListener = onCountDownListener; } public interface OnCountDownListener { /** * 倒計時 * * @param day 天 * @param hour 小時 * @param minute 分鐘 * @param second 秒 */ void countDown(String day, String hour, String minute, String second); /** * 倒計時完成 */ void countDownFinish(); }}

TestCountActivity.java

public class TestCountActivity extends AppCompatActivity { private CountDownHelper mCountDownHelper; private StrokeTextView mTvTest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_count); mTvTest = findViewById(R.id.tv_test);//設置自定義字體 Typeface fromAsset = Typeface.createFromAsset(getAssets(), 'fonts/Alibaba-PuHuiTi-Heavy.ttf'); mTvTest.setTypeface(fromAsset, Typeface.ITALIC); //自定義字體 ITALIC斜體 long aLong = 1787; mCountDownHelper = new CountDownHelper(aLong * 1000); mCountDownHelper.startCompute(); mCountDownHelper.setOnCountDownListener(new CountDownHelper.OnCountDownListener() { @SuppressLint('SetTextI18n') @Override public void countDown(String day, String hour, String minute, String second) { mTvTest.setText(hour + ':' + minute + ':' + second); } @Override public void countDownFinish() { Log.d('', '結束倒計時'); mCountDownHelper.destory(); //延時跳轉 new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { Toast.makeText(TestCountActivity.this, '時間到了', Toast.LENGTH_SHORT).show(); return false; } }).sendEmptyMessageDelayed(0, 10000);//表示延遲10秒發送任務 } }); }}

引入依賴

implementation ‘io.reactivex.rxjava2:rxjava:2.0.1’implementation ‘io.reactivex.rxjava2:rxandroid:2.0.1’

歡迎小伙伴們評論

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 楼承板设备-楼承板成型机-免浇筑楼承板机器厂家-捡来 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | 六维力传感器_六分量力传感器_模腔压力传感器-南京数智微传感科技有限公司 | 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 玻璃钢板-玻璃钢防腐瓦-玻璃钢材料-广东壹诺 | 留学生辅导网-在线课程论文辅导-留学生挂科申诉机构 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 成都租车_成都租车公司_成都租车网_众行宝 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 高压分散机(高压细胞破碎仪)百科-北京天恩瀚拓 | 噪声治理公司-噪音治理专业隔音降噪公司 | 乙炔气体报警装置|固定式氯化氢检测仪|河南驰诚电气百科 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 船老大板材_浙江船老大全屋定制_船老大官网 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 废旧物资回收公司_广州废旧设备回收_报废设备物资回收-益美工厂设备回收公司 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 云杂志网-学术期刊-首页 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 郑州宣传片拍摄-TVC广告片拍摄-微电影短视频制作-河南优柿文化传媒有限公司 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 衬塑管道_衬四氟管道厂家-淄博恒固化工设备有限公司 | 计算机毕业设计源码网| 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | STRO|DTRO-STRO反渗透膜(科普)_碟滤 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 求是网 - 思想建党 理论强党 | 真空乳化机-灌装封尾机-首页-温州精灌 | 万师讲师网-优质讲师培训师供应商,讲师认证,找讲师来万师 | 翅片管换热器「型号全」_厂家-淄博鑫科环保 |