我正在尝试制作一个看起来像这样的布局。



我正在使用github中的TriggerTrap / SeekArc。这是我的xml。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:seekarc="http://schemas.android.com/apk/res/com.triggertrap.sample"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@android:color/black"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <FrameLayout
        android:id="@+id/seekArcContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" >

        <com.triggertrap.seekarc.SeekArc
            android:id="@+id/seekArc1"
            android:layout_width="300dp"
            android:layout_height="300dp"
            android:layout_gravity="center"
            android:padding="20dp"
            seekarc:arcColor="#808080"
            seekarc:clockwise="true"
            seekarc:max="500"
            seekarc:progressColor="@android:color/white"
            seekarc:rotation="275"
            seekarc:startAngle="0"
            seekarc:sweepAngle="175"
            seekarc:thumb="@drawable/custom_seek_arc_control_selector"
            seekarc:touchInside="false" />


        <com.triggertrap.seekarc.SeekArc
            android:id="@+id/seekArc2"
            android:layout_width="300dp"
            android:layout_height="300dp"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:padding="20dp"
            seekarc:arcColor="#808080"
            seekarc:clockwise="true"
            seekarc:max="500"
            seekarc:progressColor="@android:color/white"
            seekarc:rotation="95"
            seekarc:startAngle="0"
            seekarc:sweepAngle="175"
            seekarc:thumb="@drawable/custom_seek_arc_control_selector"
            seekarc:touchInside="false" />

        <Button
            android:id="@+id/btn"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_gravity="center"
            android:background="@drawable/scrubber_pressed"/>
    </FrameLayout>

</LinearLayout>


现在的问题是,由于我使用的是框架布局,因此只能单击一个Seekarc。
如果我将seekarc更改为线性布局,则整个布局会像这样失真。



现在,所有内容都可以单击,但设计已完成。任何人都可以告诉我如何使其工作,以使按钮以及Seekarc均可触摸,并且设计不受影响。

最佳答案

@ corsair992的建议非常好。但是,在onTouchEvent()后代中重新实现FrameLayout听起来并不容易,因为它是一个非常复杂的方法,具有许多特殊条件。

在这种特殊情况下,问题在于FrameLayout包含两个SeekArc视图,而前景中的一个正在消耗所有触摸事件。因此,更改SeekArc本身以忽略不属于它的事件似乎是一个更简单的选择。如果SeekArc.ounTouchEvent()对于这些“不需要的”触摸返回false,则其FrameLayout父级将尝试将事件传递给其另一个子级-正是我们想要的。

因此,解决方案是像这样更改它:

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (isUnwantedTouch(event))
        return false;

    switch (event.getAction()) {
    // ... same as before
}


isUnwantedTouch()方法是:

protected boolean isUnwantedTouch(MotionEvent event)
{
    return (ignoreTouch(event.getX(), event.getY()) ||
            getProgressForAngle(getTouchDegrees(event.getX(), event.getY())) == INVALID_PROGRESS_VALUE);
}

08-04 06:35