我对Android L上的ViewOutlineProvider
剪辑View
有一个奇怪的问题。
我尝试在屏幕上移动手指时增加剪辑圈的大小(x坐标等)。 (例如在Android L锁定屏幕上,左右图标,当您在特定方向拖动手指时会增加)
尺寸变化完美无缺,直到剪辑边界到达屏幕的左边界或下边界,此后剪辑边界消失,我没有任何剪辑边界。 (没有四舍五入)
导致问题的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
?
答案 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()
}