实现开机动画和自定义Toolbar的高级写法

需求是自定义一个Toolbar和全屏展示一个第一次激活App的开机动画

1自定义Toolbar的使用

在这里插入图片描述

1仍然是先将工程的theme.xml中设置成NoActionBar

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.Animination" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>


</resources>

2在layout目录下自定义Toolbar布局,便于其他布局直接引用

toolbar_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="#E66161">
    
</androidx.appcompat.widget.Toolbar>

3在主布局中加入自定义的toolbar

<?xml version="1.0" encoding="utf-8"?>
<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:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
    
    <include layout="@layout/toolbar_layout"/>
    
    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="弹出dialog"/>
    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="弹出自定义动画"/>

</LinearLayout>

4在menu目录下设置toolbar上面的小控件

main,xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/backup"
        android:icon="@drawable/baseline_filter_drama_24"
        android:title="Backup"
        app:showAsAction="always"/>
    <item
        android:id="@+id/delete"
        android:icon="@drawable/baseline_delete_24"
        android:title="Delete"
        app:showAsAction="ifRoom"/>
    <item
        android:id="@+id/setting"
        android:icon="@drawable/baseline_settings_24"
        android:title="Settings"
        app:showAsAction="never"/>

</menu>

5通过实现接口的方式自定义ToolBarManager接口,并引入当前控件的menu

package com.njupt.animination.util

import android.view.MenuItem
import android.widget.Toast
import androidx.appcompat.widget.Toolbar
import com.njupt.animination.R

interface MyToolbarManager {
    val toolbar:Toolbar
    fun initMainToolBar(){
        toolbar.title="影音App"

        toolbar.inflateMenu(R.menu.main)

        //对里面的按钮进行点击事件的绑定
        toolbar.setOnMenuItemClickListener(object :Toolbar.OnMenuItemClickListener{
            override fun onMenuItemClick(item: MenuItem?): Boolean {
                when(item?.itemId){
                    R.id.backup->{
                        Toast.makeText(toolbar.context,"点击备份按钮",Toast.LENGTH_SHORT).show()
                    }
                    R.id.delete->{
                        Toast.makeText(toolbar.context,"点击删除按钮",Toast.LENGTH_SHORT).show()
                    }
                    R.id.setting->{
                        Toast.makeText(toolbar.context,"点击设置按钮",Toast.LENGTH_SHORT).show()
                    }
                }
                return true
            }

        }
        )

    }
}

6在需要使用到ToolBar的布局主类中实现接口

package com.njupt.animination

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.widget.Toolbar
import com.njupt.animination.util.MyToolbarManager

class MainActivity : AppCompatActivity() ,MyToolbarManager{
    override val toolbar: Toolbar by lazy {
        findViewById(R.id.toolbar)
    }
    private val mdialog:MyDiaglog by lazy {
        MyDiaglog(this,R.style.dialog)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //调用MyToolbarManager接口里的方法来初始化toolbar
        initMainToolBar()

        val btn=findViewById<Button>(R.id.btn1)
        btn.setOnClickListener(){
            mdialog.show()
        }
        val btn2=findViewById<Button>(R.id.btn2)
        btn2.setOnClickListener(){
            startActivity(Intent(this,SplashActivity::class.java))
        }

    }
}

2App初始动画

一般是一张图片进行动态的展示后显示出主布局,所以真正使用时将进入界面设置成当前界面,全屏显示的效果,没有ActionBar,也没有系统标题。
在这里插入图片描述

1界面布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/image_splash"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/splash"
        android:scaleType="centerCrop"
        android:scaleX="1.5"
        android:scaleY="1.5"/>

</LinearLayout>

2主程序实现

package com.njupt.animination

import android.content.Intent
import android.os.Bundle
import android.view.View
import android.view.Window
import android.view.WindowManager
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.ViewPropertyAnimatorListener

class SplashActivity:AppCompatActivity(), ViewPropertyAnimatorListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //实现全屏显示
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        window.setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
        
        setContentView(R.layout.splash_activity)
        var splashImage=findViewById<ImageView>(R.id.image_splash)
        //结束动画之后添加一个结束动画监听事件,结束后自动调转到App首页
        ViewCompat.animate(splashImage).scaleX(1.0f).scaleY(1.0f).setListener(this).setDuration(1000)
    }

    override fun onAnimationStart(view: View?) {

    }

    override fun onAnimationEnd(view: View?) {
        startActivity(Intent(this,SplashOverActivty::class.java))
    }

    override fun onAnimationCancel(view: View?) {

    }
}

3自定义的toolbar中点击设置按钮跳转到设置界面

在这里插入图片描述

1PreferenceFragment废弃问题需要使用到PreferenceFragmentCompat

加入依赖

implementation 'androidx.preference:preference:1.0.0'

2点击自定义的设置按钮后进行界面的跳转

package com.njupt.animination.util

import android.content.Intent
import android.view.MenuItem
import android.widget.Toast
import androidx.appcompat.widget.Toolbar
import com.njupt.animination.R
import com.njupt.animination.ui.activity.SettingActivity

interface MyToolbarManager {
    val toolbar:Toolbar
    fun initMainToolBar(){
        toolbar.title="影音App"

        toolbar.inflateMenu(R.menu.main)

        //对里面的按钮进行点击事件的绑定
        toolbar.setOnMenuItemClickListener(object :Toolbar.OnMenuItemClickListener{
            override fun onMenuItemClick(item: MenuItem?): Boolean {
                when(item?.itemId){
                    R.id.backup->{
                        Toast.makeText(toolbar.context,"点击备份按钮",Toast.LENGTH_SHORT).show()
                    }
                    R.id.delete->{
                        Toast.makeText(toolbar.context,"点击删除按钮",Toast.LENGTH_SHORT).show()
                    }
                    R.id.setting->{
                        //Toast.makeText(toolbar.context,"点击设置按钮",Toast.LENGTH_SHORT).show()
                        //点击设置按钮之后跳转到设置的界面
                        toolbar.context.startActivity(Intent(toolbar.context,SettingActivity::class.java))
                    }
                }
                return true
            }

        }
        )

    }

//设置界面需要的自定义toolbar
    fun initSettingToolbar(){
        toolbar.title="设置"
    }
}

3设置界面实现toolBar的接口,设置当前toolbar

package com.njupt.animination.ui.activity

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.preference.PreferenceManager
import com.njupt.animination.R
import com.njupt.animination.util.MyToolbarManager

class SettingActivity:AppCompatActivity() ,MyToolbarManager{
    override val toolbar: Toolbar by lazy {
        findViewById(R.id.toolbar)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.setting_activity)
        initSettingToolbar()

        val sp=PreferenceManager.getDefaultSharedPreferences(this)
        val push=sp.getBoolean("push",false)
        println(push)


    }
}

4自定义fragment,在fragment中继承PreferenceFragmentCompat

package com.njupt.animination.ui.fragment

import android.os.Bundle
import android.preference.PreferenceFragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import com.njupt.animination.R

class SettingFragment: PreferenceFragmentCompat() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        addPreferencesFromResource(R.xml.setting)
        return super.onCreateView(inflater, container, savedInstanceState)
    }

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {

    }

    override fun onPreferenceTreeClick(preference: Preference?): Boolean {
        when(preference?.key){
            "clear"->{Toast.makeText(this.context,"点击了按钮",Toast.LENGTH_SHORT).show()}
            "about"->{
                activity?.startActivity(Intent(activity, SplashOverActivty::class.java))
            }
        }
        return super.onPreferenceTreeClick(preference)
    }
}

5R.xml.setting设置当前设置的选项和按钮等

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <Preference
        android:key="clear"
        android:title="清除缓存"/>

    <SwitchPreference
        android:key="push"
        android:title="推送通知"
        />
    <SwitchPreference
        android:key="no_wifi"
        android:title="非wifi下加载图片"
        />
    <PreferenceCategory
        android:title="第一类">
        <Preference
            android:key="clear1"
            android:title="清除缓存1"/>
        <Preference
            android:key="clear2"
            android:title="清除缓存2"/>

    </PreferenceCategory>


    <DropDownPreference
        android:title="加载视频"/>
    <Preference
        android:key="about"
        android:title="关于"/>

    <PreferenceCategory android:title="显示一排偏好">
        <CheckBoxPreference android:key="checkbox_preference" android:title="开关偏好" android:summary="这是一个开关按钮" />
    </PreferenceCategory>
    <PreferenceCategory android:title="基于对话框的偏好">
        <EditTextPreference android:key="edittext_preference" android:title="文本输入偏好" android:summary="使用一个文本框对话框" android:dialogTitle="输入你的宠物" />
    </PreferenceCategory>
    <PreferenceCategory android:title="启动偏好">
        <PreferenceScreen android:key="screen_preference" android:title="屏幕" android:summary="显示另一个偏好屏幕">
            <!-- You can place more preferences here that will be shown on the next screen. -->
            <CheckBoxPreference android:key="next_screen_checkbox_preference" android:title="开关偏好" android:summary="另一个屏幕上的偏好" />
        </PreferenceScreen>
        <PreferenceScreen android:title="意图偏好" android:summary="通过意图启动一个Activity">
            <intent android:action="android.intent.action.VIEW" android:data="http://www.android.com"/>
        </PreferenceScreen>
    </PreferenceCategory>
    <PreferenceCategory android:title="偏好属性">
        <CheckBoxPreference android:key="parent_checkbox_preference" android:title="父开关" android:summary="这是一个父开关" />
        <CheckBoxPreference android:key="child_checkbox_preference" android:dependency="parent_checkbox_preference" android:layout="?android:attr/preferenceLayoutChild" android:title="子开关" android:summary="这是一个子开关" />
    </PreferenceCategory>

</PreferenceScreen>

在这里插入图片描述

6设置的主布局中加入fragment

setting_activity.xml

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

    <!--需要在加一个Fragment-->
    <fragment
        android:id="@+id/setting_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.njupt.animination.ui.fragment.SettingFragment"/>

</LinearLayout>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring原理学习(五):一篇讲清楚动态代理(jdk和cglib)的使用、原理和源码

目录 一、jdk动态代理的基本使用 二、cglib动态代理的基本使用 2.1 方法一&#xff1a;method.invoke() 方法反射调用 2.2 方法二&#xff08;spring使用的这个方法&#xff09;&#xff1a; methodProxy.invoke() 2.3 方法三&#xff1a;methodProxy.invokeSuper() 三、…

ChatGPT API接口使用+fine tune微调+prompt介绍

目录 1 接口调用1.1 生成key1.2 接口功能1.2.1 图片生成 (image generation)1.2.2 对话(chat)1.2.3 中文纠错 (Chinese Spelling Correct)1.2.4 关键词提取 &#xff08;keyword extract)1.2.5 抽取文本向量 (Embedding)1.2.6 微调 (fine tune) 2 如何写好prompt2.1分类任务2.2…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的拉普拉斯算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的拉普拉斯算法增强&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回…

【C++】从string开始了解STL

文章目录 1.初识STL1.什么是STL2.STL的版本3.STL的六大组件 2.string1.string类模板2.string类的构造函数3.string内部数据访问4.string的遍历5.string类的迭代器6.string的Capacity相关接口7.string的修改相关接口8.其他接口 1.初识STL 1.什么是STL STL(standard template l…

openpnp - 顶部相机 - 辅助光(环形灯)的电路原理图

文章目录 openpnp - 顶部相机 - 辅助光(环形灯)的电路原理图概述END openpnp - 顶部相机 - 辅助光(环形灯)的电路原理图 概述 同学帮我做的简易灯板设计不太合理, 发热量极大. 想看看商用的环形灯电路啥样的, 如果有可能, 自己做块灯板, 塞进商用环形灯外壳中. 拆解了一个环形…

从TOP25榜单,看半导体之变

据SIA报告显示&#xff0c;2022年全球半导体销售额创历史新高达到5740亿美元。尽管2022年下半年&#xff0c;半导体市场出现了周期性的低迷&#xff0c;但其全年的销售额相较2021年增长了3.3%。 近日&#xff0c;市调机构Gartner发布了全球以及中国大陆TOP25名半导体厂商的排名…

【软考数据库】第二章 程序语言基础知识

目录 2.1 程序设计语言的基本概念2.2 程序设计语言的基本成分2.3 编译程序基本原理 前言&#xff1a; 笔记来自《文老师软考数据库》教材精讲&#xff0c;精讲视频在b站&#xff0c;某宝都可以找到&#xff0c;个人感觉通俗易懂。 2.1 程序设计语言的基本概念 程序设计语言是…

《3-链表》

链表 引言&#xff1a; 存储数组需要内存空间连续&#xff0c;当我们需要申请一个很大的数组时&#xff0c;系统不一定存在这么大的连续内存空间。 而链表则更加灵活&#xff0c;不需要内存是连续的&#xff0c;只要剩余内存空间大小够用即可 1.定义 &#xff1a; 「链表 Lin…

文本批量翻译-批量翻译文件名

批量将英文翻译成中文的软件 批量将英文翻译成中文的软件的主要用途场景主要是在需要大量翻译英文文本到中文的场景下使用&#xff0c;例如&#xff1a; 商务文件翻译&#xff1a;许多企业需要将其商务文件&#xff0c;如合同、报告、信函等翻译成中文&#xff0c;以便其中文读…

Vulnhub项目:MrRobot

靶机地址&#xff1a;Mr-Robot: 1 ~ VulnHub 渗透过程&#xff1a; 先看描述&#xff0c;有3跟keys在这个靶机中 首先确定靶机ip&#xff0c;对靶机开放的端口进行探测 访问靶机地址&#xff0c;出现了很酷炫的web界面&#xff0c;这个mr.robot,是一个美剧&#xff0c;还是挺…

e-STUDIO2010AC•2520AC安装步骤

注意!在室内室外温差比较大的情况下,设备需要在室内静置240分钟以上才可以进行安装。

智慧园区综合管理平台开发基本功能有哪些?

随着智慧城市建设与信息化发展&#xff0c;园区管理也需要更加智能便捷化&#xff0c;于是智慧园区管理系统开发应运而生。智慧园区综合管理系统就是利用物联网、大数据等技术工具&#xff0c;顺应产业园区升级发展需求&#xff0c;实现园区环境、设备、安全、基础管理、资源服…

TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5

原文&#xff1a;Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的…

vue关于echarts后端返回格式取值方法

在vue中&#xff0c;接口返回如下数据&#xff1a; data: {充电桩: [0, 0, 78], 红外摄像头: [0, 0, 0], 火焰探测器: [0, 1, 0], 烟雾传感器: [0, 1, 1], 限流保护器: [0, 0, 1]}&#xff0c; 其中数组里第一个值应该放在data1&#xff0c;第二个放在data2&#xff0c;第三个…

docker学习

安装 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh为了防止后面权限有问题&#xff0c;执行下面这个 sudo groupadd docker sudo gpasswd -a $USER docker newgrp docker基本操作 获得镜像 docker pull hello-world运行 docker run hello-w…

蓝桥杯欲伸手CTF?有多远爬多远

注意&#xff1a;网络安全类比赛 或者说 CTF 参赛不会需要任何费用 只有国赛/省赛有可能会收取一定运维费用 其他比赛都不会收费 望周知。 先来看个特离谱的事情 早上起床看到几位师傅的朋友圈一脸懵&#xff0c;再仔细一看&#xff0c;好嘛。。。。。。 先看看探姬的回复 接下…

如何使用ChatGPT在1天内完成毕业论文

如何使用ChatGPT在1天内完成毕业论文 几天前&#xff0c;亲眼见证了到一位同学花了1天时间用ChatGPT完成了他的毕业论文&#xff0c;世道要变&#xff0c;要学会使用黑科技才能混的下去。废话到此结束&#xff0c;下面说明这么用AI生成自己的论文。 使用工具&#xff1a; 1. P…

VMware vSphere 8.0 Update 1 正式版发布 - 企业级工作负载平台

ESXi 8.0 U1 & vCenter Server 8.0 U1 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u1/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-04-18&#xff0c;VMware vSphere 8.0 Update 1 正式…

Excel技能之排名,小函数很强大

你还在熬夜加班搞Excel吗&#xff1f; 你还在用手指&#xff0c;指着电脑屏幕&#xff0c;一行一行核对数据吗&#xff1f; 你还在害怕被笑而不敢问同事吗&#xff1f; 赶紧来学Excel&#xff0c;收藏加关注&#xff0c;偷偷地进步&#xff01;日积月累&#xff0c;必成大器&am…

ADIDAS阿里纳斯励志广告语

系列文章目录 精选优美英文短文1——Dear Basketball&#xff08;亲爱的篮球&#xff09;精选优美英文短文2——Here’s to the Crazy Ones&#xff08;致疯狂的人&#xff09;“我祝你不幸并痛苦”——约翰罗伯茨毕业致辞“亲爱的波特兰——CJ麦科勒姆告别信” Hi, I’m Gilb…