android - 有没有办法不重绘/使视图无效,而是使用适合新缩放宽度和高度的布局来缩放 X 和缩放 Y?
问题描述
我有一个customView
,onDraw
有一些创建图纸100px * 100px
尺寸的路径。由于某种原因,图纸过于复杂,不同的尺寸LinearGradient
用于不同的paints
. 为简单起见,我绘制了一个箭头图像,以供您了解这个想法作为示例。
在 mycustomView
中,它具有以下属性:
可点击,如果点击彩色绘图,它将是不可见的。(这里的布局尺寸很重要,要准确或几乎准确,没有大的边距)
最初它的大小为 50%
setPivot(0,0)
,位于坐标 (a1,b1) 处。2 秒后,它最终将达到 100% 大小,
setPivot(0,0)
并且位于坐标 (a2,b2) 处。
我知道使用动画可以做 2 和 3,但是我不知道如何为我的customView
.
我知道重绘视图会花费很多内存。人们说缩放和翻译只是一些记忆和重绘不会被激活。因此,我尝试使用 valueAnimator 并setDuration
设置为 2 秒和ofInt(60)
60fps。我添加了一个 AnimatorUpdateListener 并更新了预期的当前缩放比例(0.5f+(1-0.5f)*time_elapsed/2000
并使用
view.setScaleX(current_scaling_ratio);
view.setScaleY(current_scaling_ratio);
但是,我认为使用 setScaleX 或 setScaleY 设置精确的可点击区域是有问题的。请看下面我总结的bmp图片。
setScale
只会在layout(l,t,r,b)
生效后才使用这个新的布局尺寸setScale
,无论您输入的代码的顺序如何。
然后,我尝试检查 setScaleX 背后的代码,并想看看为什么它可以缩放视图/绘图而不重绘它。但是,我发现了以下内容:
public void setScaleX(float scaleX) {
if (scaleX != getScaleX()) {
scaleX = sanitizeFloatPropertyValue(scaleX, "scaleX");
invalidateViewProperty(true, false);
mRenderNode.setScaleX(scaleX);
invalidateViewProperty(false, true);
invalidateParentIfNeededAndWasQuickRejected();
notifySubtreeAccessibilityStateChangedIfNeeded();
}
}
void invalidateViewProperty(boolean invalidateParent, boolean forceRedraw) {
if (!isHardwareAccelerated()
|| !mRenderNode.isValid()
|| (mPrivateFlags & PFLAG_DRAW_ANIMATION) != 0) {
if (invalidateParent) {
invalidateParentCaches();
}
if (forceRedraw) {
mPrivateFlags |= PFLAG_DRAWN; // force another invalidation with the new orientation
}
invalidate(false);
} else {
damageInParent();
}
}
protected void invalidateParentCaches() {
if (mParent instanceof View) {
((View) mParent).mPrivateFlags |= PFLAG_INVALIDATED;
}
}
但是,我尝试使用parentView.mPrivateFlags |= PFLAG_INVALIDATED;
Android Studio 在mPrivateFlags
. 这是一个公共参数,但我不知道为什么不能引用它。现在我不能继续了。我只想制作一个最初按比例缩小的平滑视图,在 2 秒内,它会保持线性移动并逐渐放大到原始大小。此外,可点击区域应该足够小且足够精确以适合沿飞行路径的视图,因此当我需要确定点击的点是否为 ARGB 透明或不判断它是否是有效点击时。
解决方案
推荐阅读
- python - 在一行代码中从表中获取第一个元素的列表[python]
- c# - 找不到面板添加到面板服务器端
- java - 如何包装发送消息到断路器内的队列(springboot +弹性4j)
- git - 具有多个合并提交的分支的 Git 变基
- xslt - 使用 group by 属性值转换具有某些属性的元素
- c# - 使用 c# 开发 riot api 时的请求问题
- pyspark - 如何在使用 Foundry Data Expectations 时使用过滤后的数据框过滤列并验证另一列?
- flutter - 如何检查控制器是否已使用 Flutter GetX?
- php - 使用 PHP 将文本区域的内容保存到 .txt 文件
- api - Google People API:获取特定群组的联系信息