Я написал пользовательский вид Android, который нужно рисовать вне его границ.
Это то, что у меня есть:
Это то, что происходит, когда я нажимаю кнопку, произношу правую кнопку:
Как я могу предотвратить просмотр ниже, чтобы нарисовать поверх моего "дескриптора"?
Следующий связанный псевдокод из моего проекта.
Мой пользовательский вид MyHandleView рисует вот так:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Path p = mPath;
int handleWidth = mHandleWidth;
int handleHeight = mHandleHeight;
int left = (getWidth() >> 1) - handleWidth;
canvas.save();
// allow drawing out of bounds vertically
Rect clipBounds = canvas.getClipBounds();
clipBounds.inset(0, -handleHeight);
canvas.clipRect(clipBounds, Region.Op.REPLACE);
// translate up to draw the handle
canvas.translate(left, -handleHeight);
// draw my background shape
canvas.drawPath(p, mPaint);
canvas.restore();
}
Макет что-то вроде этого (я немного упростил):
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Main content of the SlidingUpPanel -->
<fragment
android:[email protected]+id/panel"
class="com.neosperience.projects.percassi.android.home.HomeFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?android:attr/actionBarSize"
tools:layout="@layout/fragment_home" />
<!-- The Sliding Panel -->
<LinearLayout
android:id="@id/panel"
android:layout_width="match_parent"
android:layout_height="@dimen/myFixedSize"
android:alignParentBottom="true"
android:orientation="vertical"
android:clipChildren="false">
<MyHandleView xmlns:custom="http://schemas.android.com/apk/res-auto.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="0dp"
custom:handleHeight="@dimen/card_panel_handle_height"
custom:handleWidthRatio="@dimen/card_panel_handle_width_ratio"
custom:handleBackgroundColor="#000"/>
<TextView
android:id="@+id/loyaltyCardPanelTitle"
android:layout_width="match_parent"
android:layout_height="@dimen/card_panel_height"
android:background="#000"
android:gravity="center"
android:textStyle="bold"
android:textSize="24sp"
android:textColor="#fff"
android:text="My TEXT"/>
</LinearLayout>
</RelativeLayout>
Вы можете представить фрагмент как представление, содержащее две кнопки внизу, в LinearLayout.
Вместо внешнего RelativeLayout я действительно использую представление из библиотеки: SlidingUpPanelLayout (https://github.com/umano/AndroidSlidingUpPanel). Но я тестировал поведение с этим RelativeLayout: то же самое, что означает, что библиотека не связана.
Я говорю это просто, чтобы вы знали, что я не могу просто разместить там FrameLayout и избегать рисования вне границ отсечения.
Я подозреваю, что это имеет какое-то отношение к тому факту, что когда я касаюсь кнопки, она перерисовывает себя, но мой другой вид (который находится где-то еще в иерархии) не получает повторного рисования (это оптимизация, и я сомневаюсь его можно отключить).
Я хотел бы иметь возможность аннулировать мой пользовательский просмотр всякий раз, когда любое другое "близкое" (или любое) представление становится недействительным, поэтому мне нужен какой-то прослушиватель при недействительности вида, но я не знаю о нем.
Может кто-нибудь помочь?