小编sla*_*boy的帖子

Android Jetpack Compose(可组合)从协程获取字符串资源

我有一个封装密封类的 Flow,用于向 UI 调用消息。例如显示 Snackbar。我可以使用 LaunchedEffect 观察可组合项的流程。但问题是我想从协程范围中检索字符串资源。我不想在视图模型中使用直接字符串值,因为我想使用不同语言的区域设置,所以我传递了字符串 Res Id。那么有没有一种好的方法可以做到这一点,而无需将字符串资源放入 Application 类中并从那里检索它们,如此处所示getString Outside of a Context or Activity

代码如下:

  1. 我有用于显示小吃栏的脚手架,当用户单击填充整个屏幕的脚手架时,将调用 showSnackbarWithScope 方法,该方法向流发出新值。
  2. 然后通过 LaunchedEffect 捕获更改
  3. 然后它使用消息调用 showSnackbar() 方法,但该函数需要 String 并且我有 String Res Id (Int) 值
  4. 问题是我无法使用 stringResource() 方法从可组合范围中检索字符串,因为我位于协程中
@Composable
fun HomeScreen(viewModel: CityWeatherViewModel) {
 
    val scaffoldState = rememberScaffoldState() 
    LaunchedEffect(true) {
        viewModel.eventFlow.collectLatest { event ->
            when (event) {
                is CityWeatherViewModel.UIEvent.ShowSnackbar -> {
                    
                    // THE PROBLEM IS HERE!!!, since event.messageResId is res id, and not the string resource, and I can not use …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose android-jetpack-compose-scaffold

10
推荐指数
1
解决办法
8115
查看次数

updateConfiguration后如何触发重组?

我想动态更改我的应用程序语言,而不需要重新启动以Activity使结果生效。我现在要做的是添加一个可变Boolean状态,它是 switch 并由所有Text元素使用。

在此输入图像描述

要更改语言,我在可单击回调中调用以下代码(我使用该框作为虚拟对象,只是为了测试):

val configuration = LocalConfiguration.current
val resources = LocalContext.current.resources
Box( 
    modifier = Modifier
        .fillMaxWidth()
        .height(0.2.dw)
        .background(Color.Red)
        .clickable {
            
            // to change the language
            val locale = Locale("bg")
            configuration.setLocale(locale)
            resources.updateConfiguration(configuration, resources.displayMetrics)
            viewModel.updateLanguage()
        }
) {
}
Run Code Online (Sandbox Code Playgroud)

updateLanguage()然后它使用该方法切换语言值

@HiltViewModel
class CityWeatherViewModel @Inject constructor(
    private val getCityWeather: GetCityWeather
) : ViewModel() {

    private val _languageSwitch = mutableStateOf(true)
    var languageSwitch: State<Boolean> = _languageSwitch

    fun updateLanguage() {
        _languageSwitch.value = !_languageSwitch.value
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,为了更新每个Text可组合项,我需要将 …

android kotlin android-jetpack-compose android-jetpack-compose-text

7
推荐指数
1
解决办法
2941
查看次数

Android Jetpack Compose(可组合)用动画更改图像源

我有一个矢量可绘制对象通过图像的画家属性设置为源。现在我想更改源,但也要为更改设置动画。我所说的动画并不是指使用路径数据变形动画,而是想要具有简单的淡入、淡出效果。因此,一旦源更改,我希望隐藏先前的源并使用淡入淡出动画显示当前的可绘制对象。

在此输入图像描述

现在我正在做一个解决方法,我使用 2 个图像以及两个不同图像的源,并使用AnimatedVisibility来更改图像的可见性,以匹配主题。是否有改变动画源的标准方法?

这是我使用的 hack,我认为它非常丑陋

@OptIn(ExperimentalAnimationApi::class)
@Composable
fun AnimatedImage(modifier: Modifier, isLightTheme: Boolean, srcLight: Int = R.drawable.ic_sun, srcDark: Int = R.drawable.ic_moon) {

    val colors = LocalColors.current
    val (enter, exit) = remember {
        arrayListOf(
            fadeIn(animationSpec = tween(durationMillis = 1500)),
            fadeOut(animationSpec = tween(durationMillis = 500))
        )
    }

    AnimatedVisibility(
        visible = !isLightTheme,
        enter = enter as EnterTransition,
        exit = exit as ExitTransition
    ) {
        Image(
            painter = painterResource(id = srcDark), contentDescription = "",
            colorFilter = ColorFilter.tint(colors.secondsArrow),
            modifier = modifier
        )
    } …
Run Code Online (Sandbox Code Playgroud)

android android-animation android-jetpack-compose

6
推荐指数
1
解决办法
6931
查看次数

Android Studio 矢量资产被扭曲

当我在编辑器上导入矢量 svg 文件时,图标看起来正常,但是当我调试图标时,svg 中没有使用任何转换!!!我使用的是最新的Android Studio 4.0 Canary 9,因为我使用的是 Ryzen 5 处理器。

在此处输入图片说明

这是我在 Android Studio 中导入的原始 svg 文件。

<svg id="brush" 
    xmlns="http://www.w3.org/2000/svg" width="27.17" height="27.17" viewBox="0 0 27.17 27.17">
    <defs>
        <style>.cls-1{fill:#2ca0d4;}</style>
    </defs>
    <path id="Path_4" data-name="Path 4" class="cls-1" d="M9.58,18.19a4.87,4.87,0,0,0-5.3-1,4.87,4.87,0,0,0-2.86,4.39,10.27,10.27,0,0,1-.72,4.36L0,27l1.31.09c.32,0,.66,0,1,0,2.56,0,5.68-.64,7.36-2.19A4.94,4.94,0,0,0,9.58,18.19Z" />
    <path id="Path_5" data-name="Path 5" class="cls-1" d="M13,14.81A9.32,9.32,0,0,0,10.38,13c-.8.83-1.59,1.67-2.35,2.51a6.08,6.08,0,0,1,2.68,1.57,6.26,6.26,0,0,1,1.6,2.75c.83-.75,1.66-1.52,2.5-2.33A8.46,8.46,0,0,0,13,14.81Z" />
    <path id="Path_6" data-name="Path 6" class="cls-1" d="M26.82.35c-.6-.6-1.58-.87-6.34,2.83a109.1,109.1,0,0,0-8.86,8.52l-.06.06h0l0,0a11,11,0,0,1,2.55,1.89A10,10,0,0,1,16,16.32l0,0h0l.09-.09A97.7,97.7,0,0,0,24,6.7C27.69,1.93,27.41,1,26.82.35Z" />
</svg>
Run Code Online (Sandbox Code Playgroud)

即使我使用 wrap_content 作为第二面,它仍然是扭曲的

android:layout_width="500dp"
android:layout_height="wrap_content"
Run Code Online (Sandbox Code Playgroud)

当我从剪贴画中导入图标时,这是在 Android Studio 中预先制作的,图标没有问题。我导入的 svg 文件有什么问题?
在此处输入图片说明

icons svg android vector

5
推荐指数
1
解决办法
299
查看次数

Android Jetpack Compose(可组合)禁用特定可组合的硬件加速

我有一个可组合的,即使用 NativeCanvas 与 BlurMaskFilter 一起应用一些自定义模糊效果。这对于 API > 23 的设备工作正常,问题是由旧设备的硬件加速引起的。

在这里,您可以看到模糊在 API 30(左)上有效,而在 API 22(右)上则不太有效。

在此输入图像描述

我知道我可以使用 .manifest 从清单文件中手动禁用整个应用程序或活动android:hardwareAccelerated="false"

对于视图,我们可以对特定视图而不是整个活动禁用它view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

有没有一种方法可以禁用特定可组合项的硬件加速,而不是整个应用程序/活动的硬件加速?

android android-jetpack-compose

5
推荐指数
1
解决办法
1369
查看次数

Android 使用视图绑定,但没有“绑定”。全局类内的关键字

启用视图绑定后,使用:

android {
    ...
    buildFeatures {
        viewBinding = true
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以使用ViewBinding,问题是我们需要binding.在访问每个视图之前使用前缀。有没有一种方法可以省略这个前缀,并直接访问类中的视图?

所以而不是:

binding.textview1.text = viewModel.name
binding.button1.setOnClickListener { viewModel.userClicked() }
Run Code Online (Sandbox Code Playgroud)

直接使用:

textview1.text = viewModel.name
button1.setOnClickListener { viewModel.userClicked() }
Run Code Online (Sandbox Code Playgroud)

显然我们可以使用with(binding)和使用每个方法,但是有没有办法在全局范围内将其应用于整个类?

fun method = with(binding){
    // now we can access the viewbinding
    textview1.text = viewModel.name
    button1.setOnClickListener { viewModel.userClicked() }
}

Run Code Online (Sandbox Code Playgroud)

是否有任何绑定设置,我们可以指定编译器从布局生成接口:

所以它会自动生成:


public interface Fragment1BindingInterface {

  @NonNull
  TextView getTextView1();
}

public final class Fragment1Binding implements ViewBinding, Fragment1BindingInterface {
  @NonNull
  private final RelativeLayout rootView;

  @Override
  @NonNull
  private final TextView …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-viewbinding viewbinding

5
推荐指数
1
解决办法
68
查看次数

HTML5 - 在 Chrome 和 Opera 中在画布上绘制时缩放图像模糊

当我使用drawImage()函数在画布上绘制缩放图像时,它在Chrome和Opera中看起来有点模糊,但如果我先绘制全尺寸图像,然后绘制缩放图像,它看起来很清晰。造成模糊的原因是什么?如何解决?

这是原始图像: 在此输入图像描述

这是 Chrome 和 Opera 中的结果: 在此输入图像描述

const img = new Image();

const crisptCanvas = document.getElementById('crisp-canvas');
const crispContext = crisptCanvas.getContext('2d');

const blurryCanvas = document.getElementById('blurry-canvas');
const blurryContext = blurryCanvas.getContext('2d');

const sx = 0, sy = 0, sWidth = 1980, sHeight = 1251;
const dx = 0, dy = 0;
const scaleFactor = 0.4762626262626263;

// Draw an image on canvas
function scaleImage(scale, context)
{
	const dWidth = (sWidth*scale);
	const dHeight = (sHeight*scale);
	context.drawImage(img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); …
Run Code Online (Sandbox Code Playgroud)

html opera google-chrome blurry

3
推荐指数
1
解决办法
2945
查看次数

Android Jetpack Compose 将修饰符属性设置为设备宽度或高度的百分比

我希望能够将所有修改器属性设置为已知设备宽度或高度的百分比。我们的想法是,无需为所有手机(小型、中型或大型手机)支持不同的屏幕尺寸。所有手机都应具有与当前设备宽度或高度相关的相同可组合尺寸。我们应该只为tablets或实现不同的屏幕尺寸landscape mode

我知道对于宽度、高度,我们可以使用.fillMaxWidth(0.9f),并设置与 Constraints.maxWidth 相匹配的浮点值 [from = 0.0, to = 1.0] 乘以我们指定的分数。

我想指定类似于 dp、sp 的修饰符属性,但使用 dw(设备宽度)和 dh(设备高度)之类的东西。

在此输入图像描述

android kotlin android-jetpack-compose

0
推荐指数
1
解决办法
4759
查看次数