Android Glide加载图片、网络监听、设置资源监听

news2024/9/25 19:19:49

再搞事情之前首先创建一个项目,就命名为GlideDemo吧。
  在这里插入图片描述

一、项目配置

创建好之后,在app模块下build.gradle的dependencies闭包中添加如下依赖:

	//glide
    //glide
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

然后Sync同步一下。

之后在res下新建一个xml文件夹,文件夹下新建一个network_config.xml文件,里面的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

为什么要加这个呢?因为在Android9.0以后访问网络默认使用密文地址,也就是https访问,加上这个就可以访问http了,当然你还需要在AndroidManifest.xml中配置才行。
在这里插入图片描述
同时,别忘了添加网络访问权限,否则你是无法加载网络url图片的。

<uses-permission android:name="android.permission.INTERNET" />

下面进入activity_main.xml中,修改布局如下:

<?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">

    <ImageView
        android:id="@+id/iv_bg"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000"
        android:scaleType="centerCrop" />

</LinearLayout>

如需完整版资料 请点击免费领取

二、显示网络图片

这里我只是增加了一个图片控件,用于显示网络图片。 下面进入到MianActivity。

	//网络图片URL
    private String imgUrl = "http://cn.bing.com/th?id=OHR.LargestCave_ZH-CN2069899703_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp";
    //图片控件
    private ImageView ivBg;

网络图片是使用必应的图片,然后在onCreate中进行配置显示。

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //绑定id
        ivBg = findViewById(R.id.iv_bg);
        //显示图片
        Glide.with(this).load(imgUrl).into(ivBg);
    }

三、添加设置资源监听

但如果你的图片很大,网络又不是很好的情况下,就会让用户有一种不好的体验,比如,当你在地铁站里浏览资讯时,此时网络环境很差,你加载图片没有反应,而用户也无法感知,此时就会认为你的软件有问题,所以你应该告诉用户当前的图片加载情况。

加载状态监听

private static final String TAG = "MainActivity";

然后将

Glide.with(this).load(imgUrl).into(ivBg);

改成

		//显示图片
        Glide.with(this).load(imgUrl).into(new ImageViewTarget<Drawable>(ivBg) {
            //图片开始加载
            @Override
            public void onLoadStarted(@Nullable Drawable placeholder) {
                super.onLoadStarted(placeholder);
                Log.d(TAG,"图片开始加载");
            }

            @Override
            public void onLoadFailed(@Nullable Drawable errorDrawable) {
                super.onLoadFailed(errorDrawable);
                Log.d(TAG,"图片加载失败");
            }

            //图片加载完成
            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                super.onResourceReady(resource, transition);
                // 图片加载完成
                ivBg.setImageDrawable(resource);
                Log.d(TAG,"图片加载完成");
            }

            @Override
            protected void setResource(@Nullable Drawable resource) {
                Log.d(TAG,"设置资源");
            }
        });

这里使用了ImageViewTarget,它里面传入ImageView,这里默认是要你实现一个方法,那就是setResource,不过要是想实现这个状态的监听,则还需要实现onLoadStarted、onLoadFailed、onResourceReady这三个方法。现在我在上面打印了日志,下面重新运行一下,待图片加载出来之后,看一下日志。

在这里插入图片描述

这里可以看到,这是正常加载的情况,下面你可以把网络关掉,然后卸载刚才安装的应用,重新安装。

你会发现关闭网络之后图片确实没有加载出来,但是日志也没有看到有失败的字样。

这里你就要多重考虑一下了,因为加载网络图片实际上是分为两步的,第一步请求网络资源,第二步缓存资源显示出来,刚才把网络关闭了,那么我们就应该对网络请求增加监听才对。

四、添加设置资源监听

改动代码如下所示。

	//显示图片
        Glide.with(this)
                .load(imgUrl)
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        Log.d(TAG,"网络访问失败,请检查是否开始网络或者增加http的访问许可");
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        Log.d(TAG,"网络访问成功,可以显示图片");
                        return false;
                    }
                })
                .into(new ImageViewTarget<Drawable>(ivBg) {
                    //图片开始加载
                    @Override
                    public void onLoadStarted(@Nullable Drawable placeholder) {
                        super.onLoadStarted(placeholder);
                        Log.d(TAG, "图片开始加载");
                    }

                    @Override
                    public void onLoadFailed(@Nullable Drawable errorDrawable) {
                        super.onLoadFailed(errorDrawable);
                        Log.d(TAG, "图片加载失败");
                    }

                    //图片加载完成
                    @Override
                    public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                        super.onResourceReady(resource, transition);
                        // 图片加载完成
                        ivBg.setImageDrawable(resource);
                        Log.d(TAG, "图片加载完成");
                    }

                    @Override
                    protected void setResource(@Nullable Drawable resource) {
                        Log.d(TAG, "设置资源");
                    }
                });

可以看到我又增加了一个listener,里面有对网络访问的返回,成功和失败,网络状态不好的情况下才会失败,像刚才我们没有开始网络就根本不会发起网络请求,自然不会有请求的返回。

下面开启网络,运行试一下。

在这里插入图片描述 这样你就完成了加载网络图片是网络状态的监听。

五、添加加载进度条

如果你还想加上一点变化的话可以这样,修改activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <ImageView
        android:id="@+id/iv_bg"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000"
        android:scaleType="centerCrop" />

    <ProgressBar
        android:id="@+id/progressBar"
        android:visibility="gone"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>

这里我修改了根布局为RelativeLayout ,然后加上了一个ProgressBar,它默认是隐藏的,下面回到MainActivity中。

	//进度条
    private ProgressBar progressBar;

然后在onCreate中

	progressBar = findViewById(R.id.progressBar);

然后在图片设置资源时,开始时显示加载进度条,完成时隐藏进度条然后显示图片。
在这里插入图片描述

运行的效果就像下面这样。
在这里插入图片描述

当然这个加载速度取决于你的网速,快的话就是一闪而过。

现在你回头看这个Glide的加载,如果要同时满足网络加载和图片资源设置的监听,代码量就会比较多,如果我一个页面有多个地方要加载网络图片呢?我总不能写这么多重复的代码吧。因此我们可以写一个工具类来帮助我们做这一步。

六、封装工具类

新建一个GlideUtil类。 在里面写入如下代码。

/**
 * Glide工具类
 * @author llw
 */
public class GlideUtil {
	//上下文
    private static Context context;


    public static void init(Context context) {
        GlideUtil.context = context;
    }

    /**
     * 显示网络Url图片
     * @param url
     * @param imageView
     */
    public static void loadImg(String url, ImageView imageView) {
        Glide.with(context).load(url).into(imageView);
    }

    /**
     * 显示资源图片
     * @param recourseId 资源图片
     * @param imageView
     */
    public static void loadImg(Integer recourseId, ImageView imageView) {
        Glide.with(context).load(recourseId).into(imageView);
    }

    /**
     * 显示bitmap图片
     * @param bitmap
     * @param imageView
     */
    public static void loadImg(Bitmap bitmap, ImageView imageView) {
        Glide.with(context).load(bitmap).into(imageView);
    }

    /**
     * 显示drawable图片
     * @param drawable
     * @param imageView
     */
    public static void loadImg(Drawable drawable, ImageView imageView) {
        Glide.with(context).load(drawable).into(imageView);
    }
}

目前这个代码很简单,通过init方法获取上下文,然后通过多参数方法来显示图片,当然这个可以根据实际需求来进行增减,这样写其实就减少了一步操作,可以在程序初始化的时候获取应用的上下文即可,你应该知道是什么了,没错就是Application,你如果不自己写则会使用默认的,但日常开发中都会自己自定义一个Application,在里面完成一些应用的初始化配置,比如数据库的创建,一个资源库的初始化。

下面新建一个MyApplication,然后集成Application,重写onCreate方法,在里面通过GildeUtil的init方法获取上下文。

/**
 * 自定义应用
 * @author llw
 */
public class MyApplication extends Application {
    
    @Override
    public void onCreate() {
        super.onCreate();
        GlideUtil.init(this);
    }
}

修改MainActivity中onCreate中的代码。

	//显示图片
    loadImg(imgUrl, ivBg);

然后你可以运行了,虽然这种封装方式并不是很高明,但是起码代码很简洁不是吗。它可以让你选择不同的图片资源类型,根据需求选择。
在这里插入图片描述

当然这只是普通的显示,如果我在知道网络请求的情况呢? 在GlideUtil中添加

	private static final String TAG = "GlideUtil";
	//图片加载网络监听
    private static RequestListener<Drawable> requestListener = new RequestListener<Drawable>() {
        @Override
        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
            Log.d(TAG,"网络访问失败,请检查是否开始网络或者增加http的访问许可");
            return false;
        }

        @Override
        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
            Log.d(TAG,"网络访问成功,可以显示图片");
            return false;
        }
    };

然后增加一个方法。

	/**
     * 显示网络Url图片 附带加载网络监听
     * @param url
     * @param imageView
     */
    public static void loadImgListener(String url, ImageView imageView) {
        Glide.with(context)
                .load(url)
                .listener(requestListener)
                .into(imageView);
    }

然后在MainActivity中修改代码。
在这里插入图片描述
这样就可以了。那如果我也要知道这个设置图片资源的监听呢?依葫芦画瓢就行了。 在GlideUtil中增加一个方法。

	/**
     * 获取ImageViewTarget
     *
     * @param imageView
     * @return
     */
    private static ImageViewTarget<Drawable> getImageViewTarget(final ImageView imageView) {
        ImageViewTarget<Drawable> imageViewTarget = new ImageViewTarget<Drawable>(imageView) {
            @Override
            public void onLoadStarted(@Nullable Drawable placeholder) {
                super.onLoadStarted(placeholder);
                Log.d(TAG, "开始加载图片");
            }

            @Override
            public void onLoadFailed(@Nullable Drawable errorDrawable) {
                super.onLoadFailed(errorDrawable);
                Log.d(TAG, "加载图片失败");
            }

            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                super.onResourceReady(resource, transition);
                // 图片加载完成
                imageView.setImageDrawable(resource);
                Log.d(TAG, "加载图片完成");
            }


            @Override
            protected void setResource(@Nullable Drawable resource) {

            }
        };
        return imageViewTarget;
    }

然后修改loadImgListener方法。
在这里插入图片描述

再运行一下,看日志。
在这里插入图片描述

当然这种写法还是不够人性化,可能你只需要其中一个,或者都需要,或者都不需要,那如果要满足这个需求就还需要改动一下这个loadImgListener方法。

改动如下:

	/**
     * 显示网络Url图片 附带加载网络监听和设置资源监听
     * @param url  网络图片url
     * @param imageView 图片控件
     * @param needNetListener 是否需要网络监听
     * @param needResourceListener 是否需要设置资源监听
     */
    public static void loadImgListener(String url, ImageView imageView,
                                       boolean needNetListener, boolean needResourceListener) {
        if (needResourceListener) {
            Glide.with(context)
                    .load(url)
                    .listener(needNetListener ? requestListener : null)
                    .into(getImageViewTarget(imageView));
        } else {
            Glide.with(context)
                    .load(url)
                    .listener(needNetListener ? requestListener : null)
                    .into(imageView);
        }
    }

这里我增加了两个参数,用于控制是否需要网络监听和设置图片资源监听,然后改动一下MainActvity中的代码调用。
在这里插入图片描述

下面运行一下,你会发现日志都会打印。

然后都设置为false,这时候是不会有日志打印的,我就不截图了。

下面设置一个为true一个为false。 运行看看。
在这里插入图片描述

OK,到这一步是不是就没有问题了呢?

那么还有一个问题,就是如果我要显示加载进度条呢?

那么我们可以自定义一个弹窗, 首先你需要一个加载图片。如果图片是黑色背景的话,那么使用白色的加载图标无疑是很好的选择。

	<!-- 自定义loading dialog -->
    <style name="loading_dialog" parent="android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">#000</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

在styles.xml中设置弹窗样式
在这里插入图片描述

然后新增一个动画样式代码。 首先在res下新建一个anim文件夹,然后新建一个loading_animation.xml文件,里面的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="0"
        android:toDegrees="+360"
        android:duration="1500"
        android:startOffset="-1"
        android:repeatMode="restart"
        android:repeatCount="-1"/>
</set>

下面增加一个弹窗,在layout下新建loading_dialog.xml,布局代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dialog_view"
    android:orientation="vertical"
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:gravity="center"
    android:padding="10dp">

    <ImageView
        android:id="@+id/iv_loading"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@mipmap/icon_loading" />

    <TextView
        android:visibility="gone"
        android:id="@+id/tv_loading_tx"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:maxLines="1"
        android:text="玩命加载中..."
        android:textColor="#FFF"
        android:textSize="14sp" />
</LinearLayout>

这里我把文字隐藏了。下面自定义一个加载弹窗,新建一个LoadingDialog类,继承Dialog。里面的代码如下:

/**
 * 自定义加载弹窗
 * @author llw
 */
public class LoadingDialog extends Dialog {

    TextView tvLoadingTx;
    ImageView ivLoading;

    public LoadingDialog(Context context) {
        this(context, R.style.loading_dialog, "玩命加载中...");

    }

    public LoadingDialog(Context context, String string) {
        this(context, R.style.loading_dialog, string);
    }

    protected LoadingDialog(Context context, int theme, String string) {
        super(context, theme);
        setCanceledOnTouchOutside(true);//点击其他区域时   true  关闭弹窗  false  不关闭弹窗
        setContentView(R.layout.loading_dialog);//加载布局
        tvLoadingTx = findViewById(R.id.tv_loading_tx);
        tvLoadingTx.setText(string);
        ivLoading = findViewById(R.id.iv_loading);
        // 加载动画
        Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(
                context, R.anim.loading_animation);
        // 使用ImageView显示动画
        ivLoading.startAnimation(hyperspaceJumpAnimation);

        getWindow().getAttributes().gravity = Gravity.CENTER;//居中显示
        getWindow().getAttributes().dimAmount = 0.5f;//背景透明度  取值范围 0 ~ 1
    }

    //关闭弹窗
    @Override
    public void dismiss() {
        super.dismiss();
    }

然后最后一步就是在GlideUtil中去使用了,可以新写一个方法。

	//加载弹窗
    private static LoadingDialog loadingDialog;

新增loadImgListenerNeedDialog方法。

	/**
     * 显示网络Url图片 附带加载网络监听和设置资源监听 显示加载弹窗
     * @param context 显示在哪个Activity/Fragment上
     * @param url  网络图片url
     * @param imageView 图片控件
     * @param needNetListener 是否需要网络监听
     * @param needResourceListener 是否需要设置资源监听
     */
    public static void loadImgListenerNeedDialog(Context context,String url, ImageView imageView,
                                       boolean needNetListener, boolean needResourceListener) {
        loadingDialog = new LoadingDialog(context);
        if (needResourceListener) {
            Glide.with(context)
                    .load(url)
                    .listener(needNetListener ? requestListener : null)
                    .into(getImageViewTarget(imageView));
        } else {
            Glide.with(context)
                    .load(url)
                    .listener(needNetListener ? requestListener : null)
                    .into(imageView);
        }
    }

然后在getImageViewTarget中显示,这里因为,需要或者不需要弹窗的监听都是会调用getImageViewTarget,因此对弹窗进行显示和隐藏式,判断是否为空,避免程序空指针崩溃。
在这里插入图片描述

下面进入MainActivity中调用这个方法。

	//显示图片并监听网络加载情况
        loadImgListenerNeedDialog(this,imgUrl,ivBg,false,true);

运行一下:
在这里插入图片描述

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

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

相关文章

mysql的一次死锁记录

表结构 create table lzy_test.test_lzy (id int not null primary key,name varchar(128) default null,age int default 0 null,constraint key_name unique (name) );表中数据 idnameage1lzy104lzy412336lzy609lzy90 事务死锁的过程 隔离级别RC 事务A…

【沐风老师】3dMax创建缝线插件StitchLines使用方法详解

3dMax创建缝线插件使用方法详解 3dMax创建缝线插件StitchLines&#xff0c;一键生成车缝线建模&#xff0c;该脚本与可编辑多边形、可编辑样条线或 编辑多边形修改器一起使用&#xff0c;创建一条样条曲线&#xff08;车缝线&#xff09;&#xff0c;它将以几何体形式在视口中和…

云时通OMS:为零售品牌商打造高效的全渠道订单管理!

传统的零售企业围绕“人、货、场” 三要素来展开营销&#xff0c;其目标是基于“场”将货销售给更多的人。随着数字技术的应用&#xff0c;新零售模式下的“场”除了传统的线下店铺外&#xff0c;还拓展了多元化的线上渠道&#xff0c;比如小程序、企业APP、第三方平台、电商直…

学系统集成项目管理工程师(中项)系列17a_范围管理(上)

1. 包括确保项目做且只做所需的全部工作&#xff0c;以成功完成项目的各个过程 2. 项目工作明确划定边界 2.1. 什么是包括在项目之内的 2.2. 什么是不包括在项目之内的 3. 项目其他各方面管理的基础 4. 编制范围管理计划过程 4.1. 对如何定义、确认和控制项目范围的过程进…

归一化处理(2023寒假每日一题 14)

在机器学习中&#xff0c;对数据进行归一化处理是一种常用的技术。 将数据从各种各样分布调整为平均值为 0 0 0、方差为 1 1 1 的标准分布&#xff0c;在很多情况下都可以有效地加速模型的训练。 这里假定需要处理的数据为 n n n 个整数 a 1 , a 2 , ⋯ , a n a_1,a_2,⋯…

零入门kubernetes网络实战-30->基于bridge+veth pair+DNAT技术来实现外网可以访问内网的方案

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 通过DNAT技术可以将brige虚拟网桥管理的内网中的服务暴露出来&#xff0c;以供外网访问。 1、测试环境介绍 两台centos虚拟机 # 查看操作系统版本 cat /…

Typora 文字快捷修改颜色

Typora 设置字体上色快捷键 1. 安装AutoHotKey AutoHotkey 是一种 免费 和 开源 的微软Windows自定义脚本语言&#xff0c;最初旨在 提供简单的键盘快捷键或热键 &#xff0c; 快速创建宏和软件自动化 。 基于成熟的做法&#xff0c;本脚本也采用 AutoHotKey 实现。 AutoHot…

精炼计算机网络——物理层(一)

文章目录 前言2.1物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.3 信道的极限容量 2.3 物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 总结 前言 经历了两篇文章的学习&#xff0c;相信读者们一定对计算机网络有了一个基础的了解。接…

vue3+element-plus 通过v-infinite实现下拉滚动无限加载

v-infinite官网 v-infinite-scroll无限滚动组件使用详解 1、v-infinite-scroll"load" //load无限滚动加载的方法2、infinite-scroll-disabled //是否禁用无限滚动加载3、infinite-scroll-delay //节流时延&#xff0c;单位为ms4、infinite-scroll-distance //触发加载…

深入理解Java Class文件格式 constant_UTF_info

首先&#xff0c; 让我们回顾一下关于class文件格式的之前两篇博客的主要内容。 在 深入理解Java Class文件格式&#xff08;一&#xff09; 中&#xff0c; 讲解了class文件在整个java体系结构中的位置和作用&#xff0c; 讲解了class文件中的魔数和版本号相关的信息&#xff…

GitHub上“千金难求”的Spring Boot趣味实战全彩版手册,太干了

本书内容极其丰富&#xff0c;不仅涵盖了Spring MVC、MyBatis Plus、SpringData JPA、Spring Security、Quartz等主流框架&#xff0c;整合了MySQL、Druid、Redis、RabbitMQ、Elasticsearch等互联网常用技术与中间件&#xff0c;还涉及单元测试、异常处理、日志、Swagger等技术…

Vue——Vue2项目开发流程以及Element组件库的使用

Vue项目开发流程&#xff08;Vue2演示&#xff09; 在使用Vue提供的脚手架创建的项目文件里面&#xff0c;可以看见引入了三个组件 一个是Vue组件&#xff0c;有了这个下面才可以新建一个Vue实例 一个是App组件&#xff0c;下面将其使用一个render函数打包成了一个DOM元素放…

Redis分片集群和亿级访问量数据处理

一、redis分片集群 1.简介 业务场景&#xff0c;需要存储50G的数据。对于内存和硬盘配置不足&#xff0c;选用两种方式 一种&#xff1a;纵向扩展&#xff1a;加内存&#xff0c;加硬盘&#xff0c;提高CPU。简单、直接。RDB存储效率要考虑。成本要考虑。 二种&#xff1a;横…

016+limou+C语言常用的32个关键字

0.前言 本博文是在对C语言有一定深入了解后&#xff0c;对C语言最为主要的32个关键字进行了简要的概述和一些容易被忽略的细节研究&#xff0c;您可以当作学习或复习C语言基础使用&#xff08;毕竟关键字就是构成C语言语法的基石&#xff09;&#xff0c;也可以提出您所不认同…

java版企业电子招投标采购系统源码之首页设计

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部…

易岸教育:公务员两科目考试内容是什么?

&#xff08;一&#xff09;《行政能力测验》 《行政能力测验》分为常识判断、言语理解与表达、数量关系、推理判断、资料分析五大部分。 1、常识判断题共20道题&#xff0c;涵盖面广&#xff0c;内容丰富&#xff0c;可归纳为自然科学、社会科学、时事热点三大类。 2、语言…

风扇的气动性能简介

1 风扇的定义 & 分类 风扇是很常见的设备&#xff0c;应用于通风、设备散热等多种场景&#xff0c;典型如家用的电风扇、抽风机&#xff0c;各类电子设备的散热风扇等。 风扇是通过外力驱动叶片旋转引发气体运动的设备。根据AMCA Standard 210-16的规定&#xff0c;风扇对气…

一个滑模控制(SMC)实例及仿真

被控对象 考虑这么一个被控对象 J θ ( t ) u ( t ) d ( t ) J \ddot\theta(t) u(t) d(t) Jθ(t)u(t)d(t) 其中&#xff0c; J J J 为转动惯量&#xff0c; θ \theta θ 为角度&#xff0c; u u u 为控制量&#xff0c; d d d 为扰动&#xff0c;且 d ( t ) < D d(…

联想天逸510S-i5电脑如何重装windows系统

如果你的联想天逸510S-i5电脑出现了系统故障、病毒感染、运行缓慢等问题&#xff0c;你可能需要重装系统来解决。但是&#xff0c;联想天逸510S-i5电脑如何重装windows系统呢?本文将为你介绍两种方法&#xff1a;用U盘重装系统和用联想系统自带的重置功能。 ​ 联想天逸510S…

天气预报查询 API 提供个性化的天气服务的设计思路

引言 假设你是一个开发人员或公司&#xff0c;正在考虑开发一款天气应用程序&#xff0c;但你意识到市场上已经有很多竞争者在使用天气预报查询 API 来提供类似的服务&#xff0c;本文将一起探寻一些创新的方法来提高应用程序的竞争力。 扩大竞争力的一些建议 如果市面上已经…