Material Design的基本使用方法、Tollbar、菜单等

news2024/11/20 10:30:27

一、Toolbar

1、基本用法

<androidx.appcompat.widget.Toolbar
                                   android:id="@+id/toolbar"
                                   android:layout_width="match_parent"
                                   android:layout_height="?attr/actionBarSize"
                                   android:background="@color/cardview_dark_background"
                                   android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                                   app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
  • background设置颜色
  • theme设置主题色

在这里的用法是仅改变Toolbar的主题为深色但是不影响,文字的颜色。

//设置导航栏
setSupportActionBar(toolbar);

//得到这个导航栏
ActionBar actionBar = getSupportActionBar();

if (actionBar != null) {
    actionBar.setDisplayHomeAsUpEnabled(true);  //打开homeAsUp按钮
    actionBar.setHomeAsUpIndicator(R.drawable.apple);   //为这个按钮设置图片
}

setDisplayHomeAsUpEnabled(true)启用了返回箭头按钮。在onOptionsItemSelected方法中,我们处理了箭头按钮的点击事件,通常使用onBackPressed()方法来执行返回操作。

image-20230808110426220

  • popupTheme设置菜单颜色

当我们使用theme设置主题颜色以后也会导致Toolbar上的菜单颜色发生变化,这时为了不影响菜单颜色我们又重新设置菜单颜色为浅色。

app命名是为了兼容低版本

2、Toolbar中的菜单

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
          android:id="@+id/apple"
          android:icon="@drawable/apple"
          android:title="apple"
          app:showAsAction="always"/>
    <item
          android:id="@+id/onion"
          android:icon="@drawable/onion"
          android:title="onion"
          app:showAsAction="ifRoom"/>
    <item
          android:id="@+id/tomato"
          android:icon="@drawable/tomato"
          android:title="tomato"
          app:showAsAction="never"/>

</menu>

showAsAction指定按钮的显示位置,常用参数的意义

  • always:总是显示在Toolbar中
  • ifRoom:如果有空间就显示在Toolbar,没有空间就显示在菜单中
  • never:永远显示在菜单中

在MainActivity中使用**setSupportActionBar()**设置导航栏。

二、滑动菜单

1、DrawerLayout——抽屉布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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:id="@+id/drawerlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- 主内容视图 -->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/cardview_dark_background"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    </FrameLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/toolbar" /> <!-- 替换为您的菜单资源文件 -->

</androidx.drawerlayout.widget.DrawerLayout>

image-20230808161538681

通过按钮打开这个DrawerLayout

public class MainActivity extends AppCompatActivity {


    private DrawerLayout mDrawerlayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mDrawerlayout = (DrawerLayout) findViewById(R.id.drawerlayout);
        ActionBar actionBar = getSupportActionBar();

        if(actionBar != null){
            actionBar.setDisplayHomeAsUpEnabled(true);  //打开homeAsUp按钮
            actionBar.setHomeAsUpIndicator(R.drawable.apple);   //为这个按钮设置图片
        }

    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if(item.getItemId() == android.R.id.home){
            mDrawerlayout.openDrawer(GravityCompat.START);  //点击按钮后打开这个滑动窗口
        }
        return true;
    }

}

android.R.id.home:是HomeAsUp按钮的默认id

GravityCompat.START:用于启动滑动窗口的标识符

2、NavigationView——导航视图

2.1 将图片切割为圆形的工具

地址:https://github.com/hdodenhof/CircleImageView.git

dependencies {
    ...
        implementation 'de.hdodenhof:circleimageview:3.1.0'
}

2.2 使用方法

接下来编写一个新的显示界面nav_herder.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">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/iconimg"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:src="@drawable/img"
        android:layout_centerInParent="true"/>

    <TextView
        android:id="@+id/mailtext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="204dp"
        android:text="s1793026645@126.com"
        android:textSize="15sp" />

    <TextView
        android:id="@+id/userText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/iconimg"
        android:layout_marginTop="135dp"
        android:gravity="end"
        android:text="lukecc0"
        android:textSize="15sp" />

</RelativeLayout>

activity_main中将这个页面和刚才的menu菜单一起加载到NavigationView中显示。

<com.google.android.material.navigation.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/toolbar"
        app:headerLayout="@layout/nav_header"/>

打开滑动窗口后显示效果如下:

image-20230808173707303

注意我们发现apple这个菜单选项是被选中的状态,是因为我们在MainActivity中使用这句代码设置的。nacview

NavigationView nacview = (NavigationView) findViewById(R.id.navigation_view);

nacview.setCheckedItem(R.id.apple); //设置为选中状态

2.3 设置NavigationView的点击事件

nacview.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == R.id.tomato){
            Toast.makeText(MainActivity.this, "666", Toast.LENGTH_SHORT).show();
        }
        if (item.getItemId() == R.id.apple){
            //关闭滑动窗口
            mDrawerlayout.close();
        }
        return true;
    }
});

三、悬浮按钮与可交互提示、监听布局

1、FloatingActionButton——悬浮按钮

<com.google.android.material.floatingactionbutton.FloatingActionButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="bottom|end"
       android:layout_margin="30dp"
       android:src="@drawable/apple"
       android:elevation="8dp"/>

image-20230809101235080

这里使用app:elevation属性来给FloatingActionButton指定一个高度值,高度值越大,投影范围也越大,但是投影效果越淡,高度值越小,投影范围也越小,但是投影效果越浓。

2、Snackbar——可交互提示

floatingActionButton = (FloatingActionButton) findViewById(R.id.FloatingButton);
floatingActionButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Snackbar.make(view, "这是一条通知", Snackbar.LENGTH_SHORT)
            .setAction("Undo", new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(MainActivity.this, "你好", Toast.LENGTH_SHORT).show();
                }
            }).show();
    }
});

在这里我们调用了Snackbar的make方法创建一个Snackbar对象,第一个参数是View,只要是任意一个View都可以他可以自己寻找到最外层布局。

然后使用setAction可以为提示设置点击事件实现交互的目的。

image-20230809102925182

3、Coordinatorlayout——监听布局

相当于一个增强版的Framelayout,可以监听页面的子控件,然后做出合理响应。

<!-- 主内容视图 -->
<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/cardview_dark_background"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/FloatingButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="30dp"
        android:src="@drawable/apple"
        android:elevation="8dp"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

可以看出它自动使得FloatingActionButton向上偏移了。

四、卡片式布局

1、MaterialCardView——实现卡片效果

实际上MaterialCardView也属于FrameLayout,只是额外提供了阴影和圆角等效果

制作一个RecyclerView的子布局fruit_item.xml,使用MaterialCardView这个布局方式。

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_margin="5dp"
    app:cardCornerRadius="4dp">

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

        <ImageView
            android:id="@+id/FruitImage"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:scaleType="centerCrop"/>

        <TextView
            android:id="@+id/FruitText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_margin="5dp"
            android:textSize="16sp"/>

    </LinearLayout>

</com.google.android.material.card.MaterialCardView>

接下来使用RecyclerView需要制作一个adapter

public class Fruit {
    private String name;
    private int imageId;

    public Fruit(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public int getImageId() {
        return imageId;
    }
}
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {

    private Context mcontext;
    private List<Fruit> mfruit;

    public FruitAdapter(List<Fruit> mfruit) {
        this.mfruit = mfruit;
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        FruitItemBinding binding;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            binding = FruitItemBinding.bind(itemView);
        }
    }

    @NonNull
    @Override
    public FruitAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        //获取主视图的上下文
        if (mcontext == null){
            mcontext = parent.getContext();
        }

        View view = LayoutInflater.from(mcontext).inflate(R.layout.fruit_item, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull FruitAdapter.ViewHolder holder, int position) {
        Fruit fruit = mfruit.get(position);
        holder.binding.FruitText.setText(fruit.getName());
        Glide.with(mcontext).load(fruit.getImageId()).into(holder.binding.FruitImage);
    }

    @Override
    public int getItemCount() {
        return mfruit.size();
    }
}

并且在activity_main布局中设置recyclerView控件

image-20230809115408116

最后在MainActivity中启动即可

        initFruits();
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);
        recyclerView.setLayoutManager(gridLayoutManager);

        FruitAdapter adapter = new FruitAdapter(fruitList);
        recyclerView.setAdapter(adapter);

GridLayoutManager有两个参数,第二个参数意义是列数。

注意使用这种MaterialCardView需要保证应用主题必须是 Theme.MaterialComponents 或其后代主题。

显示效果如下:

image-20230809115909687

在这里发现我们的Toolbar不见了,仔细观察发现被recyclerView遮挡了。这时候就需要另外一个工具——AppBarLayout

2、AppBarLayout

用于和recyclerView进行交互作用,

<com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    
   <androidx.appcompat.widget.Toolbar
             android:id="@+id/toolbar"
             android:layout_width="match_parent"
             android:layout_height="?attr/actionBarSize"
             android:background="@color/cardview_dark_background"
             android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
             app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
             app:layout_scrollFlags="scroll|enterAlways|snap"/></com.google.android.material.appbar.AppBarLayout>

    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

首先我们定义了一个AppBarLayout将Toolbar放入AppBarLayout中。然后在RecyclerView中使用app:layout_behavior属性指定了一个布局行为,

2.1 app:layout_behavior

appbar_scrolling_view_behavior这个字符串也是Material库提供的。

通过app:layout_behavior这个属性可以解决遮挡问题。可以看出它将recyclerView向下挤压了。

image-20230809153357386

app:layout_behavior="@string/appbar_scrolling_view_behavior" 是用于指定一个视图在滚动时与 AppBarLayout 一起协调工作的属性。这个属性通常用于将滚动行为与 CoordinatorLayoutAppBarLayout 一起使用,以实现复杂的滚动效果

2.2 app:layout_scrollFlags

还记得我们在父布局使用的CoordinatorLayout吗?他可以用于监听控件变化。

可以使用 app:layout_scrollFlags 属性来定义 AppBarLayout的滚动行为。

下面是一些常见的 layout_scrollFlags 标志:

  • scroll: 指示该视图可以在滚动时折叠,即它会随着滚动事件的发生而逐渐变小。
  • enterAlways: 指示该视图在向下滚动时,会立即进入可见状态。通常与 scroll 一起使用。
  • snap: 指示该视图会在滚动结束时对齐到最近的折叠状态,以产生“捕捉”效果。

五、下拉刷新效果——SwipRefreshLayout

首先导入依赖:

依赖地址: 谷歌API参考文档

dependencies {
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
}

我们接下来使用SwipRefreshLayout将RecyclerView包住

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/swiprefresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

   <androidx.recyclerview.widget.RecyclerView
       android:id="@+id/recyclerView"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

然后我们还需设置具体的刷新逻辑才可以实现刷新功能。

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

    swipeRefreshLayout = (SwipeRefreshLayout) findViewById((int) R.id.swiprefresh);

    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            //调用写好的刷新逻辑
            refreshFruits();
        }
    });
}

//具体刷新逻辑
private void refreshFruits(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                //因为本地刷新很快,这样便于我们观察到刷新效果
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    initFruits();
                    //通知RecyclerView刷新
                    adapter.notifyDataSetChanged();

                    //表示刷新事件结束,隐藏进度条
                    swipeRefreshLayout.setRefreshing(false);
                }
            });
        }
    }).start();
}


最终显示效果如下:

image-20230809163543864

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

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

相关文章

Linux:keepalived 双热备份(基础备份web)

简介 Keepalived是一个用于Linux环境的路由软件&#xff0c;具有健康检查功能以及可用于实现高可用性(High Availability, HA)的功能。它主要支持两种协议&#xff1a;VRRP (Virtual Router Redundancy Protocol) 和 LVS (Linux Virtual Server)。Keepalived的项目源代码托管在…

一文读懂 QUIC 协议:更快、更稳、更高效的网络通信

作者 | 李龙彦 来源&#xff1a;infoQ 你是否也有这样的困扰&#xff1a;打开 APP 巨耗时、刷剧一直在缓冲、追热搜打不开页面、信号稍微差点就直接加载失败…… 如果有一个协议能让你的上网速度&#xff0c;在不需要任何修改的情况下就能提升 20%&#xff0c;特别是网络差的…

一篇文章讲清楚 Mendix 与 SAP 集成开发流程

一、引言 在今日瞬息万变的商业环境中&#xff0c;大量企业依赖SAP&#xff0c;这款全球领先的企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;来优化其业务流程。想象一下&#xff0c;在一家大型制造公司&#xff0c;SAP系统负责从供应链管理到财务报告的一切重要业…

day44:C++ day4,拷贝赋值、友元、常成员、运算符重载

一、仿照string类&#xff0c;完成myString 类 mystring.h #ifndef MYSTRING_H #define MYSTRING_H#include <iostream> #include <cstring>using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字…

计算一串输出数字的累加和

计算一个文件内数字的累加和 awk {sum$1}END{print sum} 直接抽取数据以后的打印是这样的 cat step-iostat.1125.log |grep sda |cut -c "49-56" |awk {sum$1}END{print sum}

使用Arthas诊断线上问题的常见命令(热更新,监听耗时,方法出入参,jvm信息)

Arthas 启动&#xff08;windows&#xff09; jar包丢到项目任意目录&#xff0c;启动jar&#xff0c;选择java进程&#xff0c;项目上一般选择tomcat对应的pid java -jar arthas-boot.jar * [1]: 35542[2]: 71560 math-game.jar监听方法入参及返回 参数 返回对象 调用深度…

DC/DC开关电源学习笔记(五)开关电源的主要技术指标

(五)开关电源的主要技术指标 1.输入参数2.输出参数3.效率4.电压调整率和负载调整率5.动态特性:负载突变时输出电压的变化6.电源启动时间(Set-Up Time)与保持时间(Hold-Up Time)1.输入参数 输入电压大小,交流还是直流,相数,频率等。 2.输出参数 输出功率,输出电压,输出…

java自定义注解(Annotation)

概念 注解 (Annotation)是以“注解名称”的形式存在于代码中的&#xff0c;相信用过spring的小伙伴们都会使用大量的注解。注解是JDK1.5之后引入的&#xff0c;它可以写在类、方法、属性上面&#xff0c;用于说明或标记某些含义&#xff0c;这些说明或标记可用于生成文档、程序…

golang面试题:reflect(反射包)如何获取字段tag​?为什么json包不能导出私有变量的tag?

问题 json包里使用的时候&#xff0c;会结构体里的字段边上加tag&#xff0c;有没有什么办法可以获取到这个tag的内容呢&#xff1f; 举例 tag信息可以通过反射&#xff08;reflect包&#xff09;内的方法获取&#xff0c;通过一个例子加深理解。 package mainimport (&quo…

DevSecOps 中的漏洞管理(下)

建立漏洞管理程序以支持DevSecOps 在讨论DevSecOps及DevOps模型中包含安全性的重要性时&#xff0c;建立有效的漏洞管理实践是非常重要的。这可以通过将漏洞管理设置为程序来实现。 我们可以开始对IT组织进行漏洞管理评估。人们经常问的问题可能是&#xff0c;既然已经建立了…

第一章 计算机系统概述 四、操作系统的运行机制

注:很多人习惯把Linux、Windows、MacOS的“小黑框”中使用的命令也称为“指令”&#xff0c;其实这是“交互式命令接口”&#xff0c;注意与本节的“指令”区别开。本节中的“指令”指二进制机器指令。 一、CPU的两种状态 状态的切换&#xff1a; 内核态转用户态&#xff0c;是…

【个人博客系统 × Redis】“最后的升级“ · 连接Redis · Redis的基本使用

【JavaEE】进阶 个人博客系统&#xff08;7&#xff09; 文章目录 【JavaEE】进阶 个人博客系统&#xff08;7&#xff09;1. linux安装Redis1.1 通过yum商店下载Redis1.2 启动Redis1.3 操作Redis 2. Redis的基本使用&#xff08;关键字大小写不区分&#xff09;2.1 set2.2 g…

SUMPRODUCT函数

SUMPRODUCT函数返回相应范围或数组的个数之和。 默认操作是乘法&#xff0c;但也可以执行加减除运算。 本示例使用 SUMPRODUCT 返回给定项和大小的总销售额&#xff1a; SUMPRODUCT 匹配项 Y/大小 M 的所有实例并求和&#xff0c;因此对于此示例&#xff0c;21 加 41 等于 62。…

UML-用例图

目录 一、UML 什么是UML&#xff1f; 为什么要用UML&#xff1f; UML图有哪些&#xff1f; 二、用例图 用例图摘要 用例图主要元素 1. 参与者&#xff08;Actor&#xff09; 2. 用例(Use Case) 3. 关系 4. 边界 用例图之间的关系 &#xff08;1&#xff09;参与者…

Figma实用插件速收藏!精选19个干货插件大公开!

Figma 如今有着大量的插件&#xff0c;在 UI/UX 设计领域&#xff0c;很多工作已经不用真的从零开始做了。用好 Figma 插件&#xff0c;往往能让设计工作事半功倍。不过其中的插件素质差别很大&#xff0c;需要仔细筛选。不过如果你选择了对的插件&#xff0c;合理的设置&#…

SpringCloud(17~21章):Alibaba入门简介、Nacos服务注册和配置中心、Sentinel实现熔断与限流、Seata处理分布式事务

17 SpringCloud Alibaba入门简介 17.1 why会出现SpringCloud alibaba Spring Cloud Netflix项目进入维护模式 https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now 说明 Spring Cloud Netflix Projects Entering Maintenance Mode 什么是维护模…

c高级day4(shell)

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使用变量接收结果

20230911 Shell指令数组以及函数值传递,值返回

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 #!/bin/bashfunction fun() {sum0for ((i0;i<$var;i))do(( sumarr[i] ))doneecho $sum } read -p "输入该数组个数: " var for((j0;j<$var;j)) doread -p "输入数组第$j个值: " arr[j] …

Jmeter引入外部jar包以满足加密数据的Post请求

目录 一、把项目打成jar包 1、创建一个Maven项目&#xff0c;并保证可以正常运行。 2、把工具类放置项目中&#xff0c;确保无报错且能够正常使用。 3、打包 4、验证 jar包是否有效 5、你想打多个工具类的包 二、在jmeter中使用 1、把jar包放到jmeter仓库下&#xff0c;…

Mixin从理论到实践

mixin从理论到实践 mixin从理论到实践一、什么是mixin二、使用mixin三、mixin的合并策略四、mixin辨析五、个人实践 mixin从理论到实践 一、什么是mixin mixin混入 — Vue.js (vuejs.org) 官方解释&#xff1a; 混入 (mixin) 提供了一种非常灵活的方式&#xff0c;来分发 Vue …