Android—幸运抽奖火箭发射倒计时(第六次作业)

news2024/10/7 16:23:57

Android—幸运抽奖&&点火发射(第六次作业)

创建项目

image-20231110114708197

准备工作

修改按钮的颜色,如果不修改这行代码,那么后期给按钮添加background属性的时候,按钮并不会发生变化。

image-20231110114553928

设置按钮的样式文件btn_press_blue.xml,设置了按压效果

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">     <!--按压-->
        <shape>
            <solid android:color="#0082FF"/>
            <corners android:radius="10dp"/>
        </shape>
    </item>

    <item android:state_pressed="false">
        <shape>
            <solid android:color="@color/blue"/>
            <corners android:radius="10dp"/>
        </shape>
    </item>
</selector>

其中蓝色的我选择的RGB是#FF7BBAF7

<color name="blue">#FF7BBAF7</color>

幸运抽奖

幸运⼤抽奖。⽤户单击“开始抽奖”Button后启动线程,开始抽奖过程,在界⾯上随机出现抽奖名单。用户点击”揭晓大奖“Button后,终止线程运行。

image-20231110142546147

左侧为项目结构,红色方框为新增内容或者修改的内容,右侧简单展示上述准备工作中的局部代码。

布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_start"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="开始抽奖了"
            android:textSize="20sp"
            android:background="@drawable/btn_press_blue"
            android:layout_margin="5dp"/>

        <Button
            android:id="@+id/btn_stop"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="揭晓大奖"
            android:textSize="20sp"
            android:background="@drawable/btn_press_blue"
            android:layout_margin="5dp"/>
    </LinearLayout>

    <TextView
        android:id="@+id/label"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:textSize="40sp"
        android:gravity="center"
        android:layout_gravity="center_horizontal"
        android:textColor="@color/blue"/>

    <TextView
        android:id="@+id/information"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="150dp"
        android:textSize="20sp"
        android:gravity="center"
        android:layout_gravity="center_horizontal"
        android:textColor="@color/blue"
        android:text="WeiComp 计科20xx 20200707xxxx 制作"/>

</LinearLayout>

image-20231110144647839

  1. 创建RandomService的java文件

    package com.example.servicedemo;
    
    public class RandomService extends Service {	//导包的时候导入android.app.Service
    
        private Thread luckThread;
    
        @Override
        public void onCreate() {
            super.onCreate();
            Toast.makeText(this, "幸运大抽奖开始", Toast.LENGTH_SHORT).show();
            luckThread = new Thread(null, backgroundWork, "luckThread");
        }
    
        @Override
        public void onStart(Intent intent, int startId) {
            super.onStart(intent, startId);
            Toast.makeText(this, "抽奖进行中", Toast.LENGTH_SHORT).show();
            if (!luckThread.isAlive()) {
                luckThread.start();
            }
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Toast.makeText(this, "恭喜你中奖了", Toast.LENGTH_SHORT).show();
            luckThread.interrupt();
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        private Runnable backgroundWork = new Runnable() {
            @Override
            public void run() {
                try {
                    while (!Thread.interrupted()) {
                        int randomDouble = (int) Math.round(Math.random() * 2 + 1);
                        int randomDouble1 = (int) Math.round(Math.random() * 2);
                        int randomDouble2 = (int) Math.round(Math.random() * 9);
                        MainActivity.UpdateGUI(randomDouble, randomDouble1, randomDouble2);
                        Thread.sleep(1000);
                        if (randomDouble1 == randomDouble2 && randomDouble1 == 0) {
                            luckThread.interrupt();
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
    }
    
  2. MainAcitivty.java函数

    package com.example.servicedemo;
    
    public class MainActivity extends AppCompatActivity {
    
        private Button btn_start, btn_stop;
        private static Handler handler = new Handler();
        private static TextView labelView = null;
        private static int randomDouble, randomDouble1, randomDouble2;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn_start = findViewById(R.id.btn_start);
            btn_stop = findViewById(R.id.btn_stop);
            labelView = findViewById(R.id.label);
    
            handler = new Handler();
    
            final Intent serviceIntent = new Intent(this, RandomService.class);
            btn_start.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    startService(serviceIntent);
                }
            });
    
            btn_stop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    stopService(serviceIntent);
                    handler.post(RefreshLable);
                }
            });
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            MainActivity.UpdateGUI(randomDouble, randomDouble1, randomDouble2);
            Toast.makeText(this, "恭喜你中奖了", Toast.LENGTH_SHORT).show();
        }
    
    
        public static void UpdateGUI(int refreshDouble, int refreshDouble1, int refreshDouble2) {
            randomDouble = refreshDouble;
            randomDouble1 = refreshDouble1;
            randomDouble2 = refreshDouble2;
            handler.post(RefreshLable);
        }
    
        private static Runnable RefreshLable = new Runnable() {
            @Override
            public void run() {
                labelView.setText(String.valueOf("20200707" + randomDouble +
                        randomDouble1 +
                        randomDouble2));
            }
        };
    }
    
  3. 修改AndroidManifest.xml代码(确保将服务的启动和停止操作正确注册在 AndroidManifest.xml 中。)

    <application>
        ...
        <service
            android:name=".RandomService"
            android:enabled="true"
            android:exported="false" />
        ...
    </application>
    

    image-20231110145128774

效果图

image-20231110144517588

火箭发射倒计时

使用Timer实现火箭倒计时功能。(参照例6-6)请在界面适当的位置添加个人信息,如姓名或拼音,以防止作业雷同。上传代码及模拟器图片。

【例6-6】火箭点火倒计时。在UI界面上设计一个TextView和一个Button。当用户点击Button时,启动Timer工作,在TextView上显示10至1的倒计时数字,数字每秒变化一次。当显示到1后,TextView上显示“点火成功”。

布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp">

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:textSize="40sp"
        android:textColor="@color/blue"
        android:gravity="center" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/btn_press_blue"
        android:text="点火发射"
        android:textSize="25sp"
        android:textColor="@color/white"
        android:layout_centerInParent="true" />

</RelativeLayout>

image-20231110151933448

MainActivity.java

package com.example.timerdemo;

public class MainActivity extends AppCompatActivity {

    private Button button;
    private TextView textView;
    private Timer timer;
    private TimerTask timerTask;

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

        textView = findViewById(R.id.textview);
        button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startTimer();
            }
        });
    }

    private void startTimer() {
        timer = new Timer();

        timerTask = new TimerTask() {
            int i = 10; //倒计时数目

            @Override
            public void run() {
                Message message = Message.obtain();
                message.what = i;
                handler.sendMessage(message);
                i--;
            }
        };

        timer.schedule(timerTask, 1000, 1000);
    }

    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (msg.what > 0) {
                textView.setText(" " + msg.what);
            } else {
                // 在handler里可以更改UI组件
                textView.setText("点火成功");
                timer.cancel();
            }
        }
    };
}

运行结果

image-20231110151843564

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1192985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

innovus/ICC2:实际绕线层次有低于routing rule min layer的情况如何解决?

ICC2 这是因为routing rule的min layer是soft rule&#xff0c;如果希望min layer严格按照设置的来&#xff0c;还需要手动添加如下命令: set_routing_rule -min_layer_mode hard -rule xx [get_nets xx] innovus 设置route type是加入min_stack_layer选项。 create_route_…

react 修改less文件后保存,内存溢出,项目崩溃问题解决

一、完整报错 一个很老的react项目&#xff0c;因为没有package-lock.json版本锁&#xff0c;导致拉下来的时候&#xff0c;安装的依赖版本冲突&#xff0c;好不容易启动起来&#xff0c;修改less文件后只要一保存&#xff0c;项目就会崩溃&#xff0c;需要重启&#xff0c;报…

nginx配置和热部署实践

目录 一、nginx配置文件 1.配置文件 2.nginx配置文件语法 3.include 二、nginx.conf参数 1.user参数 2.nginx.conf重要的指令块 3.nginx命令行 三、nginx热部署功能实践 1.热部署的特点 2.大致流程 3.环境准备 4.备份旧nginx二进制文件 5.下载编译安装新的nginx …

vue:实现顶部消息横向滚动通知

前言 最近有个需求&#xff0c;是在系统顶部展示一个横向滚动的消息通知。需求很简单&#xff0c;就是消息内容从右往左一直滚动。 效果如下&#xff1a; 因为我的需求很简单&#xff0c;功能就这样。如果有什么其他需求&#xff0c;可以再继续修改。 代码 使用 <noti…

SQL表、字段、查询参数获取

SQL工具类表、字段、查询参数提取 1. 执行效果2. 使用2.1 引入依赖2.2 相关实体2.3 工具类 1. 执行效果 2. 使用 2.1 引入依赖 <!-- sql 解析处理--><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifact…

说说你在使用React 过程中遇到的常见问题?如何解决?

一、前言 在使用react开发项目过程中&#xff0c;每个人或多或少都会遇到一些"奇怪"的问题&#xff0c;本质上都是我们对其理解的不够透彻 react 系列&#xff0c;33个工作日&#xff0c;33次凌晨还在亮起的台灯&#xff0c;到今天就圆满画上句号了&#xff0c;比心…

通用工作站设计方案 :807-ORI-S3R500 -多路PCIe3.0的单CPU通用工作站

ORI-S3R500 -多路PCIe3.0的单CPU通用工作站 (研华工业计算机IPC-610&#xff0c;IPC940 升级款) 一、机箱功能和技术指标&#xff1a; 系统 系统型号 ORI-SR500 主板支持 EEB(12*13)/CEB(12*10.5)/ATX(12*9.6)/Mi cro ATX 前置硬盘 最大支持2个3.5寸1个2.5寸SATA …

2024 款:最新前端技术趋势

Hello&#xff0c;大家好&#xff0c;我是 Sunday。 上一次的时候聊了 那么些已经落后的前端开发技术 。但是光知道什么技术落后了是不够的&#xff0c;咱们还得知道 前端最新的技术趋势是什么。所以&#xff0c;今天这篇文章&#xff0c;咱们就来聊一聊&#xff0c;2023 最新…

IDEA 使用Reset Current Branch to Here 进行git 版本控制,图文操作

文章目录 一、总结区别&#xff08;只针对本地仓库操作&#xff09;Soft详细解释文件版本冲突处理 Mixed详细解释Hard详细解释Keep详细解释文件版本冲突处理 二、其他Revert commit 参考文档 一、总结区别&#xff08;只针对本地仓库操作&#xff09; Soft详细解释 Soft操作只…

Linux本地部署1Panel现代化运维管理面板并实现公网访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

nginx的配置文件说明

nginx的配置文件说明 https://blog.csdn.net/S_ZaiJiangHu/article/details/126838279 https://blog.csdn.net/qq_33454884/article/details/89212702 二、nginx的正向代理和反向代理 2.1 nginx的反向代理 2.1.1 反向代理说明 对于客户端来说&#xff0c;反向代理就好像目标…

STM32——NVIC中断优先级管理分析

文章目录 前言一、中断如何响应&#xff1f;NVIC如何分配优先级&#xff1f;二、NVIC中断优先级管理详解三、问题汇总 前言 个人认为本篇文章是我作总结的最好的一篇&#xff0c;用自己的话总结出来清晰易懂&#xff0c;给小白看也能一眼明了&#xff0c;这就是写博客的意义吧…

【中间件篇-Redis缓存数据库03】Redis高级特性和应用(发布 订阅、Stream)

Redis高级特性和应用(发布 订阅、Stream) 发布和订阅 Redis提供了基于“发布/订阅”模式的消息机制&#xff0c;此种模式下&#xff0c;消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道( channel)发布消息&#xff0c;订阅该频道的每个客户端都可以收到该消息。 …

遇到问题[已解决]TypeError: ‘odict_keys‘ object is not subscriptable

背景 运行CPD代码时&#xff0c;由于源代码踊跃python2.7&#xff0c;但是我的是3.8出现报错 【Python3】【报错】- TypeError: ‘dict_keys‘ object is not subscriptable-CSDN博客 原因&#xff1a; 在Python3中&#xff0c;keys()方法不允许切片 VGG代码如下 解决办法: 就…

最新GitHub学生认证,可以愉快的使用Copilot了(保姆级教程)

&#x1f388;博客主页&#xff1a;&#x1f308;我的主页&#x1f308; &#x1f388;欢迎点赞 &#x1f44d; 收藏 &#x1f31f;留言 &#x1f4dd; 欢迎讨论&#xff01;&#x1f44f; &#x1f388;本文由 【泠青沼~】 原创&#xff0c;首发于 CSDN&#x1f6a9;&#x1f…

Project Office X for Mac项目管理工具

Project Office X是一款全能的项目管理软件&#xff0c;可帮助企业或个人有效地规划、协调和执行项目。它具有直观的用户界面和强大的功能&#xff0c;适用于各种规模的项目。 这个软件提供了多种实用工具&#xff0c;包括项目计划、资源管理、任务分配、进度跟踪、风险管理和团…

Google Firebase PHP实现消息推送

获取key的方法&#xff1a; 登录谷歌开发者后台 https://console.firebase.google.com/?hlzh-cn function firebaseNotice($title,$body){$token_arr[token1,token2]; //用户的firebasetoken列表$notify_msg ["notification" > ["title" > $title…

NodeJs - 单线程模型和高并发处理原理

NodeJs - 单线程模型和高并发处理原理 前言一. NodeJs 线程模型1.1 NodeJs 模型分析1.2 NodeJs处理事件请求的流程1.3 NodeJs 和传统 Server 的对比 二. Cluster 模块利用多核CPU处理三. 总结 前言 我们都知道JavaScript是单线程的处理。但是我们在Node开发、Egg开发下&#x…

Ubuntu 20.04编译Chrome浏览器

本文记录chrome浏览器编译过程&#xff0c;帮助大家避坑qaq 官网文档&#xff1a;https://chromium.googlesource.com/chromium/src//main/docs/linux/build_instructions.md 一.系统要求 一台64位的英特尔机器&#xff0c;至少需要8GB的RAM。强烈推荐超过16GB。至少需要100…

问题排查-进程分析工具-001strace-安装方式--用法用量

参考来源&#xff1a; centos7 安装strace 《极客时间-网络排查案例课》 strace工具介绍 跟网络排查中有 tcpdump 这样强大的工具类似&#xff0c;进程的排查也有相关的强大工具&#xff0c;比如strace。通过 strace&#xff0c;我们可以把排查工作从进程级别&#xff0c;继续…