是否可以触摸CollapsingToolbarLayout内的ImageView并滚动它?

时间:2015-10-10 17:59:28

标签: android imageview android-collapsingtoolbarlayout android-appbarlayout

我试图获得全屏match_parent,但当我将AppBarLayout设置为ImageView的高度时,我无法滚动CollapsingToolbarLayout<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_height="match_parent" android:layout_width="match_parent" android:id="@+id/drawer"> <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/app_bar_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="16dp" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="48dp" app:expandedTitleMarginEnd="64dp"> <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" android:fitsSystemWindows="true" app:layout_collapseMode="parallax" android:contentDescription="@null" android:src="@drawable/background" /> <android.support.v7.widget.Toolbar android:layout_height="?attr/actionBarSize" android:layout_width="match_parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_collapseMode="pin" app:theme="@style/ToolbarTheme" android:id="@+id/toolbar"/> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:id="@+id/scroll" android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> </FrameLayout> </android.support.v4.widget.NestedScrollView> </android.support.design.widget.CoordinatorLayout> <com.myapplication.ScrimInsetsFrameLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="304dp" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:insetForeground="#4000" android:clickable="true" android:background="#ffffff"> ... </com.myapplication.ScrimInsetsFrameLayout> </android.support.v4.widget.DrawerLayout> 内。我必须留出一些空间,以便我可以触摸&#34;白色&#34;活动(在AppBarLayout我添加了 android:layout-marginBottom:&#34; 16dp&#34; )然后,在我触摸它之后,我可以滚动ImageView,否则我可以&#39;吨。 每次我运行应用程序并首次触摸布局时都会发生这种情况。所以我必须首先触摸白色,然后滚动图像。

你能帮帮我吗?

int[] coord = new int[2];
coord[0] = 3;
coord[1] = 2;

编辑 @PPartisan我已经完成了你的所作所为,但这里是我得到的:

enter image description here

2 个答案:

答案 0 :(得分:2)

这不是一个很好的解决方案,但它可以在我的测试设备上运行。它通过向触发嵌套滚动的AppBar显式分配触摸侦听器来启动滚动过程。

首先,创建一个扩展NestedScrollView的自定义类,并添加以下方法,使其看起来像这样:

public class CustomNestedScrollView extends NestedScrollView {

    private int y;

    public CustomNestedScrollView(Context context) {
        super(context);
    }

    public CustomNestedScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public boolean dispatchHandlerScroll(MotionEvent e) {
        switch (e.getAction()) {
            case MotionEvent.ACTION_DOWN:
                y = (int) e.getY();
                startNestedScroll(2);
                break;
            case MotionEvent.ACTION_MOVE:
                int dY = y - ((int)e.getY());
                dispatchNestedPreScroll(0, dY, null, null);
                dispatchNestedScroll(0, 0, 0, dY, null);
                break;
            case MotionEvent.ACTION_UP:
                stopNestedScroll();
                break;
        }
        return true;
    }
}

然后,在Activity课程中,为TouchListener分配AppBarLayout

appBarLayout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return customNestedScrollView.dispatchHandlerScroll(event);
    }
});

并在AppBar第一次完全折叠时将其删除:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (Math.abs(appBarLayout.getY()) == appBarLayout.getTotalScrollRange()) {
        appBarLayout.setOnTouchListener(null);
    }
    return super.dispatchTouchEvent(ev);
}

修改

按照以下步骤启动并运行:

  • NestedScrollViewxml)中的android.support.v4.widget.NestedScrollView替换为CustomNestedScrollView(其格式为com.something.somethingelse.CustomNestedScrollView,具体取决于具体位置它在你的项目中)。

  • 将其分配到Activity onCreate()中的变量(即CustomScrollView customScrollView = (CustomScrollView) findViewById(R.id.custom_scroll_view_id);

  • 在您的TouchListener上设置appBarLayout,就像您在编辑中所做的那样。现在,当您致电dispatchHandlerScroll()时,它将出现在customNestedScrollView个实例上。

  • dispatchTouchEvent()是您在Activity课程中覆盖的方法,因此它应位于TouchListener

  • 之外

所以,例如:

public class MainActivity extends AppCompatActivity {

    private AppBarLayout appBarLayout;
    private CustomNestedScrollView customNestedScrollView;
    //...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //...
        customNestedScrollView = (CustomNestedScrollView) findViewById(R.id.scroll);

        appBarLayout = (AppBarLayout) findViewById(R.id.app_bar_layout);
        appBarLayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
             public boolean onTouch(View v, MotionEvent event) {
                 return customNestedScrollView.dispatchHandlerScroll(event);
             }
        });
    }    

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (Math.abs(appBarLayout.getY()) == appBarLayout.getTotalScrollRange()) {
            appBarLayout.setOnTouchListener(null);
        }
        return super.dispatchTouchEvent(ev);
    }
}

希望能够解决问题。

答案 1 :(得分:0)

尝试添加一个小边距,以便下方的空白区域几乎不可见(您可能还希望将白色更改为强调色,以便空间不可见)

另一种方法是通过获取屏幕高度来动态设置应用栏布局的高度。

编辑: 这可能是一个焦点问题,尝试为主要内容添加虚拟布局,这将自动聚焦

    <LinearLayout
        android:layout_width="0px"
        android:layout_height="0px"
        android:focusable="true"
        android:focusableInTouchMode="true" />

甚至只是将这些属性添加到您的内容布局

android:focusable="true"
android:focusableInTouchMode="true"