Android L ViewOutlineProvider,创建rect侧时的奇怪行为是屏幕外

时间:2014-12-11 18:21:22

标签: android view android-5.0-lollipop

我对Android L上的ViewOutlineProvider剪辑View有一个奇怪的问题。

我尝试在屏幕上移动手指时增加剪辑圈的大小(x坐标等)。 (例如在Android L锁定屏幕上,左右图标,当您在特定方向拖动手指时会增加)

尺寸变化完美无缺,直到剪辑边界到达屏幕的左边界或下边界,此后剪辑边界消失,我没有任何剪辑边界。 (没有四舍五入)

enter image description here

enter image description here

导致问题的Rect值:

Rect(-1, 1033 - 101, 1136) (Rect(left, top - right, bottom))

我以这种方式启动并添加我要剪辑的视图:

toClipView = new ViewClipTest(getContext());
toClipView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
addView(toClipView);

剪辑视图为灰色背景,红色ImageView为子视图,扩展为FrameLayout

更新剪辑边界缩放的代码(从onTouchEvent调用,而ACTION_MOVE):

public void scaleClipbounds(float convertScale) {//-1 to 1
    float scale = ...;

    currentScale = scale;

    ...

    post(new Runnable() {
        @Override
        public void run() {
            setOutlineProvider(new ClipOutline(createScaledRect(currentScale)));
            invalidate();
        }
    });

}

...

    case MotionEvent.ACTION_MOVE:
            newX = event.getRawX();
            newY = event.getRawY();

            float newScale = ...;

            scaleClipbounds(newScale);
 ...

我的ViewOutlineProvider

public class ClipOutline extends ViewOutlineProvider {

    private Rect outerLineRect;

    public ClipOutline(Rect outerLineRect) {
        this.outerLineRect = outerLineRect;
    }

    @Override
    public void getOutline(View view, Outline outline) {
        outline.setOval(outerLineRect);
    }
}

Xml结构:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.ClipViewTestContainer
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

如果我使用同一个rect启动剪辑边界,这会导致问题,一切正常,直到我再次尝试增加onTouch时的边界。

这里我的错误是什么?或者我如何强制剪辑边界可以设置在屏幕边界之外?是否有更流畅的方式来实现此类功能,而不是使用ViewOutlineProvider

1 个答案:

答案 0 :(得分:2)

问题是你传入setOval(-1,1033 - 101,1136)的矩形大小为102 x 103,这意味着你的大纲不会是一个圆圈,因此不符合剪裁。只有圆圈,圆圈和圆形裁剪可以剪裁到,请参阅https://developer.android.com/reference/android/graphics/Outline.html#canClip()

此外,您可以通过在scaleClipBounds中更新现有的自定义大纲提供程序并调用View#invalidateOutline()来显着简化runnable / outline提供程序的创建。

public void scaleClipbounds(float convertScale) {
    ...
    mOutlineProvider.setRect(rect)
    invalidateOutline()
}