JetpackCompose从入门到实战学习笔记14

news2024/10/6 4:06:38

JetpackCompose从入门到实战学习笔记14——Coli的简单使用

1.简介:

Coil 是一个 Android官方出的配合Jetpack的图片加载库,通过 Kotlin 协程的方式加载图片。

优点如下:

  1. 更快: Coil 在性能上有很多优化,包括内存缓存和磁盘缓存,把缩略图存保存在内存中,循环利用 bitmap,自动暂停和取消图片网络请求等。
  2. 更轻量级: Coil 只有2000个方法(前提是你的 APP 里面集成了 OkHttp 和 Coroutines),Coil 和 Picasso 的方法数差不多,相比 Glide 和 Fresco 要轻量很多。
  3. 更容易使用: Coil 的 API 充分利用了 Kotlin 语言的新特性,简化和减少了很多样板代码。
  4. 更流行: Coil 首选 Kotlin 语言开发并且使用包含 Coroutines, OkHttp, Okio 和 AndroidX Lifecycles 在内最流行的开源库。 Coil 名字的由来:取 Coroutine Image Loader 首字母得来。

2.添加依赖:

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation "androidx.compose.ui:ui:$compose_version"
    implementation 'androidx.compose.material3:material3:1.0.1'
    implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
    implementation 'androidx.activity:activity-compose:1.3.1'
    implementation 'androidx.compose.material:material:1.0.0-rc01'
    implementation "androidx.constraintlayout:constraintlayout-compose:1.0.1"
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
    debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
    debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version"
    debugImplementation "androidx.compose.ui:ui-text:$compose_version"
    implementation "io.coil-kt:coil-compose:2.2.2"
    implementation "io.coil-kt:coil-svg:2.2.2"
    implementation "com.github.skydoves:landscapist-coil:2.0.3"
    implementation "com.github.skydoves:landscapist-glide:2.1.0"
    implementation "com.github.skydoves:cloudy:0.1.1"
    implementation "io.coil-kt:coil-gif:2.3.0"
    implementation "com.airbnb.android:lottie-compose:$lottieVersion"
}

在这里插入图片描述

3.Coli加载网络图片:

@Preview
@Composable
fun AsyncImageDemo() {
    AsyncImage(
        model = ImageRequest.Builder(LocalContext.current)
            .data(ImageUrl.testUrl1)
            .crossfade(true)
            .build(),
        contentDescription = "compose",
        placeholder = painterResource(id = R.mipmap.place_holder),
        error = painterResource(id = R.mipmap.place_holder),
        onSuccess = {
            Log.d(TAG, "success")
        },
        onError = { error ->
            Log.d(TAG, "error")
        },
        onLoading = { loading ->
            Log.d(TAG, "loading")
        },
        modifier = Modifier.clip(CircleShape)
    )
}

4.效果预览如下:

在这里插入图片描述

5.异步加载图片:

@Preview
@Composable
fun SubcomposeAsyncImageDemo() {
    SubcomposeAsyncImage(
        model = ImageRequest
            .Builder(LocalContext.current)
            .data(ImageUrl.testUrl1)
            .build(),
        contentDescription = "compose_museum"
    ) {
        if (painter.state is AsyncImagePainter.State.Loading || painter.state is AsyncImagePainter.State.Error) {
            CircularProgressIndicator()
        } else {
            SubcomposeAsyncImageContent()
        }
    }
}

6.效果预览:

在这里插入图片描述

7.网络进度加载图片:

@Preview
@Composable
fun AsyncImagePainterDemo() {
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        SubcomposeAsyncImage(
            model = ImageUrl.testUrl2 ,
            loading = { CircularProgressIndicator() },
            contentDescription = null,
            modifier = Modifier.size(200.dp,600.dp)
        )
        SubcomposeAsyncImage(
            model = ImageUrl.testUrl2 ,
            contentDescription = null,
            modifier = Modifier.size(200.dp)
        ) {
            val state = painter.state
            when(state) {
                is AsyncImagePainter.State.Loading -> CircularProgressIndicator()
                is AsyncImagePainter.State.Error -> Text("${state.result.throwable}")
                is AsyncImagePainter.State.Success -> SubcomposeAsyncImageContent()
                is AsyncImagePainter.State.Empty -> Text("Empty")
            }
        }
    }
}

8.效果预览:

在这里插入图片描述

9.Coli加载圆形图片:

@Composable
fun circleImageDemo() {
    Column(
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Image(
            modifier = Modifier
                .fillMaxWidth()
                .height(500.dp),
            painter = rememberImagePainter(
                data = ImageUrl.testUrl1,
                builder = {
                    placeholder(R.mipmap.avatar)
                    crossfade(true)
                    transformations(CircleCropTransformation())//圆形图片
                }),
            contentDescription = "composeCircleDemo"
        )
        Spacer(modifier = Modifier.width(10.dp))
        Text(text = "圆形图片示例")
    }
}

10.效果预览:

在这里插入图片描述

11.Coli加载圆角图片:

@Preview
@Composable
fun clipImageDemo() {
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        Image(
            modifier = Modifier
                .fillMaxWidth()
                .padding(20.dp)
                .height(400.dp),
            painter = rememberImagePainter(
                data = ImageUrl.testUrl1,
                builder = {
                    placeholder(R.mipmap.avatar)
                    crossfade(true)
                    transformations(RoundedCornersTransformation(30f, 30f, 30f, 30f))
                }),
            contentDescription = "composeClipDemo"
        )
        Text(text = "加载圆角图片")
    }
}

12.效果预览:

在这里插入图片描述

13.Coli加载gif图片:

@Preview
@Composable
fun coliLoadGifDemo() {
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        //自己构建图片加载器
        val imageLoader = ImageLoader.Builder(LocalContext.current)
            .components(fun ComponentRegistry.Builder.() {
                if (SDK_INT >= 28) {
                    add(ImageDecoderDecoder.Factory())
                } else {
                    add(GifDecoder.Factory())
                }
            }).build()
        Image(
            modifier = Modifier
                .fillMaxWidth()
                .height(400.dp)
                .padding(20.dp),
            painter = rememberImagePainter(
                data = ImageUrl.testGif,
                imageLoader = imageLoader,
                builder = {
                    placeholder(R.mipmap.avatar)//占位图
                    crossfade(true)//淡出效果
                }),
            contentDescription = null
        )
        Text(text = "加载gif图片")
    }
}

14.效果预览:

在这里插入图片描述

15.Coli加载svg图片:

@Preview
@Composable
fun CoilSvgDemo() {
    //coli加载svg图片,这里的图片格式是由svg转换后,虽然后缀不少.svg
    val context = LocalContext.current
    val imageLoader = ImageLoader.Builder(context)
        .components { add(SvgDecoder.Factory()) }
        .crossfade(true)
        .build()
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        Image(
            painter = rememberAsyncImagePainter(
                ImageUrl.svgUrl2,
                imageLoader = imageLoader,
            ),
            contentDescription = null,
            modifier = Modifier
                .fillMaxWidth()
                .height(400.dp)
                .padding(20.dp)
        )
        Text(text = "coli加载svg格式图片")
    }
}

16.效果预览:

在这里插入图片描述

17.Cloudy高斯模糊图片:

Cloudy 是一个专门处理Jectpack Compose中的Blur高斯模糊效果的支持库,它可以向后兼容低版本,由于官方的SDK中的Modifier.blur()修饰符只能支持运行在Android 12+的设备上才有效果,所以可以使用该库做兼容支持。

Cloudy 也不属于 Accompanist 库的一部分,是一个三方库,这里只是实现一下效果.

@Preview(showBackground = true)
@Composable
fun ModifierBlurSample() {
    Column(
        Modifier.padding(15.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        var progress by remember{ mutableStateOf(0f)}
        val radius by animateDpAsState(targetValue = (progress * 10f).dp)
        Text(
            text = "高斯模糊效果示例",
            Modifier.blur(
                radius = radius,
                edgeTreatment = BlurredEdgeTreatment.Unbounded
            ),
            fontSize = 20.sp
        )
        Image(
            painter = painterResource(id = R.mipmap.avatar),
            contentDescription = null,
            modifier = Modifier
                .height(400.dp)
                .fillMaxWidth()
                .blur(
                    radius = radius,
                    edgeTreatment = BlurredEdgeTreatment.Unbounded
                ),
        )
        Slider(
            value = progress,
            onValueChange = { progress = it },
        )
    }
}

18.效果预览:

这里我是使用自己的Android13版本的手机测试的,发现有很明显的高斯模糊效果,但是在12以下的手机和模拟器上面都没有效果~~

在这里插入图片描述

19.设置模糊度效果:

@Preview
@Composable
fun BlurCloudyLibSample() {
    Column(
        Modifier.padding(15.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        var radius by remember{ mutableStateOf(0)}
        // radius支持范围是[0..25]
        Cloudy(radius = radius) {
            Column {
                AsyncImage(
                    model = ImageUrl.testUrl2,
                    contentDescription = null,
                    onSuccess = { radius = 1 },
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(400.dp)
                )
                Spacer(modifier = Modifier.width(20.dp))
                Text(text = "高斯模糊渐变效果测试", fontSize = 30.sp)
            }
        }
        Spacer(modifier = Modifier.width(20.dp))
        Row(
            modifier = Modifier.fillMaxWidth(),
            horizontalArrangement = Arrangement.SpaceEvenly,
            verticalAlignment = Alignment.CenterVertically
        ) {
            Button(onClick = { if (radius > 0) radius-- }) { Text(text = "模糊度减") }
            Text(text = "radius: $radius", fontSize = 30.sp)
            Button(onClick = { if (radius < 25) radius++ }) { Text(text = "模糊度加") }
        }
    }

}

20.效果预览:

在这里插入图片描述

21.完整代码如下:

package com.example.composemodifiterdemo

import android.content.ContentValues.TAG
import android.os.Build.VERSION.SDK_INT
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.*
import androidx.compose.material.Button
import androidx.compose.material.CircularProgressIndicator
import androidx.compose.material.Slider
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.BlurredEdgeTreatment
import androidx.compose.ui.draw.blur
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil.ComponentRegistry
import coil.ImageLoader
import coil.compose.*
import coil.decode.GifDecoder
import coil.decode.ImageDecoderDecoder
import coil.decode.SvgDecoder
import coil.request.ImageRequest
import coil.transform.CircleCropTransformation
import coil.transform.RoundedCornersTransformation
import com.skydoves.cloudy.Cloudy
import com.skydoves.landscapist.ImageOptions
import com.skydoves.landscapist.coil.CoilImage

/**
 *@author: njb
 *@date:  2023/3/15 17:56
 *@desc:
 */

class ColiSampleActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            //AsyncImageDemo()
            // SubComposeAsyncImageDemo()
            // AsyncImagePainterDemo()
            //circleImageDemo()
            //clipImageDemo()
            coliLoadGifDemo()
            //CoilSvgDemo()
            // CoilImageSVGDemo()
            //loadBlurSample()
           // BlurCloudyLibSample()
        }
    }
}

@Preview
@Composable
fun AsyncImageDemo() {
    AsyncImage(
        model = ImageRequest.Builder(LocalContext.current)
            .data(ImageUrl.testUrl1)
            .crossfade(true)
            .build(),
        contentDescription = "compose",
        placeholder = painterResource(id = R.mipmap.place_holder),
        error = painterResource(id = R.mipmap.place_holder),
        onSuccess = {
            Log.d(TAG, "success")
        },
        modifier = Modifier
            .fillMaxWidth()
            .height(500.dp)
    )
}

@Composable
fun circleImageDemo() {
    Column(
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Image(
            modifier = Modifier
                .fillMaxWidth()
                .height(500.dp),
            painter = rememberImagePainter(
                data = ImageUrl.testUrl1,
                builder = {
                    placeholder(R.mipmap.avatar)
                    crossfade(true)
                    transformations(CircleCropTransformation())//圆形图片
                }),
            contentDescription = "composeCircleDemo"
        )
        Spacer(modifier = Modifier.width(10.dp))
        Text(text = "圆形图片示例")
    }
}

@Preview
@Composable
fun clipImageDemo() {
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        Image(
            modifier = Modifier
                .fillMaxWidth()
                .padding(20.dp)
                .height(400.dp),
            painter = rememberImagePainter(
                data = ImageUrl.testUrl1,
                builder = {
                    placeholder(R.mipmap.avatar)
                    crossfade(true)
                    transformations(RoundedCornersTransformation(30f, 30f, 30f, 30f))
                }),
            contentDescription = "composeClipDemo"
        )
        Text(text = "加载圆角图片")
    }
}

@Preview
@Composable
fun coliLoadGifDemo() {
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        //自己构建图片加载器
        val imageLoader = ImageLoader.Builder(LocalContext.current)
            .components(fun ComponentRegistry.Builder.() {
                if (SDK_INT >= 28) {
                    add(ImageDecoderDecoder.Factory())
                } else {
                    add(GifDecoder.Factory())
                }
            }).build()
        Image(
            modifier = Modifier
                .fillMaxWidth()
                .height(400.dp)
                .padding(20.dp),
            painter = rememberImagePainter(
                data = ImageUrl.testGif,
                imageLoader = imageLoader,
                builder = {
                    placeholder(R.mipmap.avatar)//占位图
                    crossfade(true)//淡出效果
                }),
            contentDescription = null
        )
        Text(text = "加载gif图片")
    }
}


@Preview
@Composable
fun SubComposeAsyncImageDemo() {
    SubcomposeAsyncImage(
        model = ImageRequest
            .Builder(LocalContext.current)
            .data(ImageUrl.testUrl2)
            .build(),
        contentDescription = "composeAsyncDemo",
        modifier = Modifier
            .fillMaxWidth()
            .height(500.dp)
    ) {
        if (painter.state is AsyncImagePainter.State.Loading || painter.state is AsyncImagePainter.State.Error) {
            CircularProgressIndicator()
        } else {
            SubcomposeAsyncImageContent()
        }
    }
    Text(text = "composeAsyncDemo")
}


@Preview
@Composable
fun AsyncImagePainterDemo() {
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        SubcomposeAsyncImage(
            model = ImageUrl.testUrl2,
            loading = { CircularProgressIndicator() },
            contentDescription = null,
            modifier = Modifier.size(200.dp, 600.dp)
        )
        SubcomposeAsyncImage(
            model = ImageUrl.testUrl2,
            contentDescription = null,
            modifier = Modifier.size(200.dp)
        ) {
            val state = painter.state
            when (state) {
                is AsyncImagePainter.State.Loading -> CircularProgressIndicator()
                is AsyncImagePainter.State.Error -> Text("${state.result.throwable}")
                is AsyncImagePainter.State.Success -> SubcomposeAsyncImageContent()
                is AsyncImagePainter.State.Empty -> Text("Empty")
            }
        }
    }
}

@Preview
@Composable
fun CoilSvgDemo() {
    //coli加载svg图片
    val context = LocalContext.current
    val imageLoader = ImageLoader.Builder(context)
        .components { add(SvgDecoder.Factory()) }
        .crossfade(true)
        .build()
    Image(
        painter = rememberAsyncImagePainter(
            ImageUrl.svgUrl2,
            imageLoader = imageLoader,
        ),
        contentDescription = null,
        modifier = Modifier
            .fillMaxWidth()
            .height(400.dp)
    )
}

@Composable
fun CoilImageSVGDemo() {
    // 加载网络svg
    val context = LocalContext.current
    val imageLoader = ImageLoader.Builder(context)
        .components { add(SvgDecoder.Factory()) }
        .build()
    var flag by remember { mutableStateOf(false) }
    val size by animateDpAsState(targetValue = if (flag) 600.dp else 300.dp)
    CoilImage(
        imageModel = { ImageUrl.svgUrl2 },
        imageOptions = ImageOptions(
            contentScale = ContentScale.Crop,
            alignment = Alignment.Center
        ),
        modifier = Modifier
            .size(size)
            .clickable(
                onClick = { flag = !flag },
                indication = null,
                interactionSource = MutableInteractionSource()
            ),
        imageLoader = { imageLoader }
    )
}

@Preview(showBackground = true)
@Composable
fun loadBlurSample() {
    Column(
        Modifier.padding(15.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        var progress by remember { mutableStateOf(0f) }
        val radius by animateDpAsState(targetValue = (progress * 10f).dp)
        Text(
            text = "高斯模糊效果示例",
            Modifier.blur(
                radius = radius,
                edgeTreatment = BlurredEdgeTreatment.Unbounded
            ),
            fontSize = 20.sp
        )
        Image(
            painter = painterResource(id = R.mipmap.test_iage),
            contentDescription = null,
            modifier = Modifier
                .height(400.dp)
                .fillMaxWidth()
                .blur(
                    radius = radius,
                    edgeTreatment = BlurredEdgeTreatment.Unbounded
                ),
        )
        Slider(
            value = progress,
            onValueChange = { progress = it },
        )
    }
}

@Preview
@Composable
fun BlurCloudyLibSample() {
    Column(
        Modifier.padding(15.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        var radius by remember { mutableStateOf(0) }
        // 模糊度支持范围是[0..25]
        Cloudy(radius = radius) {
            Column {
                AsyncImage(
                    model = ImageUrl.svgUrl2,
                    contentDescription = null,
                    onSuccess = { radius = 1 },
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(400.dp)
                )
            }
        }
        Text(text = "高斯模糊渐变效果测试", fontSize = 20.sp)
        Row(
            modifier = Modifier.fillMaxWidth(),
            horizontalArrangement = Arrangement.SpaceEvenly,
            verticalAlignment = Alignment.CenterVertically
        ) {
            Button(onClick = { if (radius > 0) radius-- }) { Text(text = "模糊度减") }
            Text(text = "模糊度设置: $radius", fontSize = 20.sp)
            Button(onClick = { if (radius < 25) radius++ }) { Text(text = "模糊度加") }
        }
    }
}

class ImageUrl {
    companion object {
        val url: String by lazy {
            "https://qcloudimg-moss.cp47.ott.cibntv.net/data_center/files/2022/10/26/67a66d35-3f7c-4de8-9dfe-c706e42f44f2.jpg"
        }
        var urlTest: String =
            "https://pic-go-bed.oss-cn-beijing.aliyuncs.com/img/20220316151929.png"
        var svgUrl: String =
            "https://developer.android.google.cn/static/images/jetpack/compose/animation-flowchart.svg"
        var svgUrl2 = "https://photo.16pic.com/00/76/45/16pic_7645957_b.png"
        var svgUrl3 = "https://photo.16pic.com/00/64/28/16pic_6428912_b.png"
        var svgUrl4 =
            "https://img0.baidu.com/it/u=480894149,21356393&fm=253&fmt=auto&app=138&f=JPEG?w=786&h=500"
        var svgUrl5 =
            "https://img1.baidu.com/it/u=4053028698,2643070273&fm=253&fmt=auto&app=138&f=JPEG?w=1200&h=500"
        var testUrl =
            "https://img0.baidu.com/it/u=450558320,2864057328&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500"
        var testUrl1 = "https://image5.cnpp.cn/upload/images/20171114/11542556845_840x560.jpg"
        var testUrl2 =
            "https://img2.baidu.com/it/u=3107178066,1951512797&fm=253&fmt=auto&app=138&f=JPEG?w=704&h=500"
        var testGif = "https://img-blog.csdnimg.cn/b286b49591dc4bbd8578300a6e6cfb8e.gif#pic_center"
    }
}

22.总结:

以上就是今天的学习内容,在compose中简单使用coli,希望对大家有帮助,一起学习,共同进步!!

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

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

相关文章

C/C++基础知识

专栏&#xff1a;C/C 个人主页&#xff1a; C/C基础知识 前言C关键字(C98)命名空间命名空间的定义正常的命名空间的定义如何使用命名空间 命名空间可以嵌套同一个工程中允许存在多个相同名称的命名空间&#xff0c;编译器最后会合成同一个命名空间中(一个工程中的.h文件和test.…

(数字图像处理MATLAB+Python)第七章图像锐化-第一、二节:图像锐化概述和微分算子

文章目录 一&#xff1a;图像边缘分析二&#xff1a;一阶微分算子&#xff08;1&#xff09;梯度算子A&#xff1a;定义B&#xff1a;边缘检测C&#xff1a;示例D&#xff1a;程序 &#xff08;2&#xff09;Robert算子A&#xff1a;定义B&#xff1a;示例C&#xff1a;程序 &a…

Tailscale: Please Restart the Tailscale Windows Service

之前用的好好的&#xff0c;最近重新升级了一下Tailscale后发现一直连不上。右击win10右下角的Tailscale图标&#xff0c;第一行显示&#xff1a;Please Restart the Tailscale Windows Service。 我查看了一下服务&#xff0c;发现Tailscale是自动的&#xff0c;这里的启动类…

vuex存储数组(新建,增,删,更新),并存入localstorage定时删除

vuex存储数组(新建&#xff0c;增&#xff0c;删&#xff0c;更新)&#xff0c;并存入localstorage定时删除 本文目录 vuex存储数组(新建&#xff0c;增&#xff0c;删&#xff0c;更新)&#xff0c;并存入localstorage定时删除使用背景store中实现增删改组件中维护数组&#x…

缩小数据文件

今天又出现12.2c 环境的问题&#xff0c;1T的数据空间还剩下2G&#xff0c;吓了一身冷汗&#xff0c;赶紧查看原因&#xff0c;不知道哪路业务大神作妖了。 发现sysaux和system增加N多数据文件&#xff0c;而且目前使用不多&#xff0c; 缩小表空间的数据文件 可以使用下面的语…

直升机空气动力学基础---002 桨叶的主要参数

源于 1.桨叶的平面形状和主要参数 由于其设计制造比较简单&#xff0c;早期直升机大多采用矩形桨叶&#xff0c;缺点是在高速气流中&#xff0c;无法抑制桨尖涡&#xff0c;会消耗向下的诱导速度&#xff0c;降低旋翼的拉力。现代多采用梯形桨叶。 桨尖后掠能够降低桨尖涡 …

【Linux】Linux基本指令(2)

一.你如何看待指令 指令说白了就是可执行程序&#xff0c;且指令一定是在系统的某一个位置存在的&#xff0c;在执行指令前&#xff0c;我们需要先找到它。 二.man指令 众所周知&#xff0c;Linux的指令有很多&#xff0c;指令的选项也有很多&#xff0c;我们不可能全记住&…

android注解注入AspectJ面向切面AOP插桩技术改变android原生类对象行为记录View点击事件,Java(3)

droid注解注入AspectJ面向切面AOP插桩技术改变android原生类对象行为记录View点击事件&#xff0c;Java&#xff08;3&#xff09; 动态改变Toast提示的内容&#xff0c;弹之前修改。Button在每次点击后记录。 import android.util.Log; import android.widget.Toast;import o…

基于天牛须(BAS)与NSGA-Ⅱ混合算法的交直流混合微电网多场景多目标优化调度(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

论Shell编程规范与变量

目录 一&#xff1a;shell脚本 1.shell概述 2.linux中包含的常用shell 3.shell脚本概述 4.shell脚本应用场景 5.shell脚本的作用 6.用户的登录shell 二&#xff1a; 编写脚本 1.脚本的基本格式 2.shell脚本的执行 3. 交互式硬件设备 4.重定向操作 5.管道操作符号 “…

信号完整性分析基础知识之传输线和反射(一):阻抗变化引起反射

阻抗不连续引起的反射和失真可能会导致信号的误触发和误码&#xff0c;这是导致信号失真和质量下降的主要原因。 在某些情况下&#xff0c;这看起来像振铃。当信号电平下降时&#xff0c;下冲会影响噪声预算并导致误触发。或者&#xff0c;在下降信号上&#xff0c;峰值可能会上…

阅读笔记 First Order Motion Model for Image Animation

文章解决的是图片动画的问题。假设有源图片和驱动视频&#xff0c;并且其中的物体是同一类的&#xff0c;文章的方法让源图片中的物体按照驱动视频中物体的动作而动。 文章的方法只需要一个同类物体的视频集&#xff0c;不需要而外的标注。 方法 该方法基于self-supervised策…

Qt信号槽原理

Qt之信号槽原理 一.概述 所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号&#xff08;signal&#xff09;。这种发出是没有目的的&#xff0c;类似广播。如果有对象对这…

idea无效的目标版本和类文件具有错误的版本 61.0, 应为 52.0错误(测试有用,一次性解决问题)

SpringBoot己更新到3后&#xff0c;使用的JAVA版本最低要求JAVA17&#xff0c;如果低于这个版本就是报错&#xff1a; 问题一&#xff1a;类文件具有错误的版本 61.0, 应为 52.0。 解决就只有升级JAVA-sdk&#xff1a; 官方下载地址&#xff1a;JAVA20-17 官方推荐更好的sd…

MySQL 视图、函数和存储过程

MySQL 是一种流行的关系型数据库管理系统&#xff0c;其具有强大的功能和灵活性&#xff0c;使其成为了许多企业和个人喜爱的数据库选择。在 MySQL 中&#xff0c;视图、函数和存储过程是常见的数据库对象&#xff0c;它们都有助于提高数据的处理效率和可重用性。 一、视图 视…

UE5实现Runtime环境下绘制点功能

文章目录 1.实现目标2.实现过程2.1 C++实现2.2 蓝图调用3.参考资料1.实现目标 UE5在Runtime环境下基于PDI绘制点,GIF动态如下: 2.实现过程 UE常用的在运行时环境下绘制点方法主要有两种。一种是基于Mesh,即添加Sphere等StaticMesh来模拟显示绘制点;另一种是基于Primitive的…

用代码实现标签打印的三种方式

最近项目中要实现标签打印的功能&#xff0c;有几个条件 标签模板可以事先生成&#xff0c;用的是CodeSoft软件标签模板里面有二维码标签模板里面有一些变量&#xff0c;要求打印的时候自动填充产线电脑上没有安装CodeSoft&#xff0c;即便安装也不能使用&#xff0c;因为没有…

Java线程池及拒绝策略详解

前文提到线程的使用以及线程间通信方式&#xff0c;通常情况下我们通过new Thread或者new Runnable创建线程&#xff0c;这种情况下&#xff0c;需要开发者手动管理线程的创建和回收&#xff0c;线程对象没有复用&#xff0c;大量的线程对象创建与销毁会引起频繁GC&#xff0c;…

Unity入门(一)

Unity Unity是一套完善体系与编辑器的跨平台游戏开发工具&#xff0c;也可以称之为游戏引擎。游戏引擎是指一些编写好的可以重复利用的代码与开发游戏所用的各功能编辑器。 基于C#编程&#xff0c;易上手&#xff0c;高安全性独特的面向组件游戏开发思想让游戏开发更加简单易…

Maven 如何下载依赖包的源码包

使用Maven下载依赖包的时候&#xff0c; 默认是不会下载源码包的&#xff0c;但是有时候&#xff0c; 需要Debug代码&#xff0c;或是看看依赖项的源码的写法&#xff0c; 就需要下载源码包了。 这里以 Apache 的 commons-text 为例&#xff0c; 在Maven中添加如下依赖配置&am…