Jam*_*ieH 18 android android-fragments wear-os
我正在构建一个Android Wear应用程序,我希望将其作为几个可以横向滑动的页面呈现.
为此,我使用GridViewPager和相关联的FragmentGridPagerAdapter,它使用单行进行硬连线.这适用于在瓷砖之间水平滑动,但是在我的一个片段中,我想使用WearableListView来允许用户在多个动作之间进行选择.不幸的是,这不起作用,因为看起来GridViewPager阻止任何滑动到达WearableListView.有没有人知道是否有办法可以使用描述的组件完成?
我也尝试过使用标准的ViewPager,这样可以让WearableListView滚动得很好,但是水平滑动变得很好,你经常需要滑动几次才能移动视图寻呼机.
Mor*_*rne 31
编辑:
在下面发布我的原始答案一段时间后,我找到了正确的方法来做到这一点.刚设置
wearableListView.setGreedyTouchMode( true )
Run Code Online (Sandbox Code Playgroud)
列表视图在GridViewPager中完美运行.
原始答案仍然是一个很好的视图,使滚动工作与垂直滚动GridViewPager嵌套在水平滚动一个.
原始答案:
通过像这样扩展GridViewPager,可以更简洁地实现与接受的答案大致相同的事情:
public class HorizontalListPager extends GridViewPager {
private final GestureDetector mGestureDetector;
public HorizontalListPager( Context context, AttributeSet attrs ) {
super( context, attrs );
mGestureDetector = new GestureDetector( context, new HScrollDetector() );
}
@Override
public boolean onInterceptTouchEvent( MotionEvent ev ) {
// If we have more horizontal than vertical scrolling, intercept the event,
// otherwise let the child handle it
return super.onInterceptTouchEvent( ev ) && mGestureDetector.onTouchEvent( ev );
}
class HScrollDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll( MotionEvent e1, MotionEvent e2, float distanceX, float distanceY ) {
// Returns true if scrolling horizontally
return ( Math.abs( distanceX ) > Math.abs( distanceY ) );
}
}
}
Run Code Online (Sandbox Code Playgroud)
Gra*_*ung 10
我碰到了同样的事情.只设置一行或覆盖canscrollvertically()不起作用.我发现的唯一选择是覆盖触摸事件,如Neevek的答案: ScrollView Touch Handling中的HorizontalScrollView
这对我有用:
private float xDistance, yDistance, lastX, lastY;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
setDownPosition(ev);
break;
case MotionEvent.ACTION_MOVE:
if (isVerticalScroll(ev))
return false;
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
setDownPosition(ev);
break;
case MotionEvent.ACTION_MOVE:
if (isVerticalScroll(ev))
return false;
}
return super.onTouchEvent(ev);
}
private void setDownPosition(MotionEvent ev){
xDistance = yDistance = 0f;
lastX = ev.getX();
lastY = ev.getY();
}
private boolean isVerticalScroll(MotionEvent ev){
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - lastX);
yDistance += Math.abs(curY - lastY);
lastX = curX;
lastY = curY;
if(xDistance < yDistance) {
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5027 次 |
| 最近记录: |