我有一个封装密封类的 Flow,用于向 UI 调用消息。例如显示 Snackbar。我可以使用 LaunchedEffect 观察可组合项的流程。但问题是我想从协程范围中检索字符串资源。我不想在视图模型中使用直接字符串值,因为我想使用不同语言的区域设置,所以我传递了字符串 Res Id。那么有没有一种好的方法可以做到这一点,而无需将字符串资源放入 Application 类中并从那里检索它们,如此处所示getString Outside of a Context or Activity
代码如下:
@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
我想动态更改我的应用程序语言,而不需要重新启动以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
我有一个矢量可绘制对象通过图像的画家属性设置为源。现在我想更改源,但也要为更改设置动画。我所说的动画并不是指使用路径数据变形动画,而是想要具有简单的淡入、淡出效果。因此,一旦源更改,我希望隐藏先前的源并使用淡入淡出动画显示当前的可绘制对象。
现在我正在做一个解决方法,我使用 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) 当我在编辑器上导入矢量 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 文件有什么问题?

我有一个可组合的,即使用 NativeCanvas 与 BlurMaskFilter 一起应用一些自定义模糊效果。这对于 API > 23 的设备工作正常,问题是由旧设备的硬件加速引起的。
在这里,您可以看到模糊在 API 30(左)上有效,而在 API 22(右)上则不太有效。
我知道我可以使用 .manifest 从清单文件中手动禁用整个应用程序或活动android:hardwareAccelerated="false"。
对于视图,我们可以对特定视图而不是整个活动禁用它view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
有没有一种方法可以禁用特定可组合项的硬件加速,而不是整个应用程序/活动的硬件加速?
启用视图绑定后,使用:
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) 当我使用drawImage()函数在画布上绘制缩放图像时,它在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)我希望能够将所有修改器属性设置为已知设备宽度或高度的百分比。我们的想法是,无需为所有手机(小型、中型或大型手机)支持不同的屏幕尺寸。所有手机都应具有与当前设备宽度或高度相关的相同可组合尺寸。我们应该只为tablets或实现不同的屏幕尺寸landscape mode。
我知道对于宽度、高度,我们可以使用.fillMaxWidth(0.9f),并设置与 Constraints.maxWidth 相匹配的浮点值 [from = 0.0, to = 1.0] 乘以我们指定的分数。
我想指定类似于 dp、sp 的修饰符属性,但使用 dw(设备宽度)和 dh(设备高度)之类的东西。
android ×7
kotlin ×4
android-jetpack-compose-scaffold ×1
android-jetpack-compose-text ×1
blurry ×1
html ×1
icons ×1
opera ×1
svg ×1
vector ×1
viewbinding ×1