首页 > 解决方案 > 有没有办法不重绘/使视图无效,而是使用适合新缩放宽度和高度的布局来缩放 X 和缩放 Y?

问题描述

我有一个customViewonDraw有一些创建图纸100px * 100px尺寸的路径。由于某种原因,图纸过于复杂,不同的尺寸LinearGradient用于不同的paints. 为简单起见,我绘制了一个箭头图像,以供您了解这个想法作为示例。

在 mycustomView中,它具有以下属性:

  1. 可点击,如果点击彩色绘图,它将是不可见的。(这里的布局尺寸很重要,要准确或几乎准确,没有大的边距)

  2. 最初它的大小为 50% setPivot(0,0),位于坐标 (a1,b1) 处。

  3. 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 透明或不判断它是否是有效点击时。

标签: androidviewscaling

解决方案


推荐阅读