0

所以这不是一个关于代码的技术问题,而是更多关于一些想法的问题。我是 android 开发的新手,因此我并不完全熟悉它所提供的很多东西。

我在屏幕上有一个项目列表,您可以上下滚动以查看不同的项目。

当我决定让项目能够左右滑动以显示像面板这样的设置时,我的问题出现了,它们下面有几个选项(每个项目下面都有自己的设置,而不是所有项目的设置屏幕) )。我四处寻找不同的方法来做到这一点,但似乎找不到一种有效的方法。到目前为止,我在想的是在其中HorizonalScrollView包含我的项目,设置菜单位于屏幕左侧或右侧,但是当我将文本区域放在 中时HorizonalScrollView,它只占屏幕的一半,所以我可以适应两个并排,不是我想要的,最终结果也不会是我想象的。我真的想要一个允许设置位于项目下的解决方案,因此当您将其推开时,它会显示设置。

有没有更好的方法,或者我应该继续努力做我的HorizonalScrollView工作,任何关于我如何去做的指南或想法将不胜感激。

查看我的应用程序,看看我是否能找到一个具有类似功能的应用程序,gmail 应用程序有。这是一个图像链接,可以让您了解,在您将项目滑动到一侧后,它会在项目的位置显示一个撤消或存档按钮,就好像它们隐藏在您滑开的列表项下一样在此处输入图像描述

4

1 回答 1

2

这个问题是一个非常有趣的话题。并准备好做一些定制的事情。

首先,删除Horizo​​nalScrollView,我认为它不会帮助你。每个项目的布局应该是这样的(伪代码,您可以自己构建 XML =]):

FrameLayout
   RelativeLayout id:topContent background:someSolidColor
          // inside this RelativeLayout, the stuff that is visible on the ListView
   RelativeLayout id:bottomContent
          // inside this RelativeLayout, the stuff that is behind the content
/FrameLayout

这样一来,您实际上就是将一件事放在另一件事之上。另请注意,topContent 具有纯色背景。如果您不指定任何背景,则两个 RelativeLayouts 都将可见。另请注意,我使用RelativeLayout,只是因为我喜欢它们,而且我喜欢它们的灵活性,但这将取决于您的列表视图的内容和您的设置。

现在,当事情变得有趣时,您将需要一个 GestureDetector 来检测手指滑动,您将使用该值在id:topContent.

你可以像这样创建一个 TouchListener:

public class MySlideListener extends View.OnTouchListener{

    private View v;
    private GestureDetector gestureDetector;

    public MySlideListener (View v){
        this.v = v;
        gestureDetector = new GestureDetector(v.getContext(), myGestureListener);
    }

   public boolean onTouch (View v, MotionEvent event){
         return gestureDetector.onTouchEvent(event);
   }

    private SimpleOnGestureListener myGestureListener = new SimpleOnGestureListener(){
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){

           // now here we make the view scroll
           MarginLayoutParams lp = (MarginLayoutParams) view.getLayoutParams();
           lp.leftMargin = distanceX;
           lp.rightMargin = -distanceX;

          // You might need to call view.requestLayout();
          //  but first give it a try without it

          // This part of the method for processing the horizontal
          // offset can (and should) be further developed to add some
          // 'snap-in' or transparency functionality to make the whole
          // concept work better.
          // But this code should give you a proof of concept on how to deal with stuff.

          // The important part is that now you have a call back that have access
          // to the view during onScroll.

          // Also might be necessary to enable/disable the bottomContent view
          // in order for it to be not clickable whilst not visible.

           return true;
        }
    }
}

然后为每个topContentListView 设置一个新的侦听器(可能在适配器的 getView 内部)topContentView.setOnTouchListener(new MySlideListener(topContentView));

请记住,所有这些代码都是我用心输入的,并且 100% 未经测试!

编辑:

上面的代码是正确的方向,但它是 100% 未经测试的东西。现在下面的代码,我刚刚编译,测试,这段代码有效!

这个类也更有效率,因为您可以只创建一个并将相同的实例应用于适配器上创建的所有项目。您可以看到它让视图在触摸事件上滚动。

public class MySlideListener implements View.OnTouchListener {

    private View view;
    private ListView listView;
    private GestureDetector gestureDetector;

    public MySlideListener(ListView lv) {
        listView = lv;
        gestureDetector = new GestureDetector(lv.getContext(), myGestureListener);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        view = v;
        gestureDetector.onTouchEvent(event);
        return true;
    }

    private SimpleOnGestureListener myGestureListener = new SimpleOnGestureListener() {

    private int origLeft, origRight;

    public boolean onDown(MotionEvent e) {
        MarginLayoutParams lp = (MarginLayoutParams) view.getLayoutParams();
        origLeft = lp.leftMargin;
        origRight = lp.rightMargin;
        return true;
    };

    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        listView.requestDisallowInterceptTouchEvent(true);
        MarginLayoutParams lp = (MarginLayoutParams) view.getLayoutParams();
        lp.leftMargin = (int) (origLeft + (e2.getRawX() - e1.getRawX()));
        lp.rightMargin = (int) (origRight - (e2.getRawX() - e1.getRawX()));
        view.requestLayout();
        return true;
    };
    };
}
于 2013-04-23T21:43:25.153 回答