自定义水平滚动动画在android中查看手指视图

时间:2013-04-23 21:13:28

标签: java android horizontal-scrolling

所以这不是代码的技术问题,而是更多关于某些想法的问题。我是Android开发人员的新手,因此我并不完全熟悉它提供的很多内容。

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

当我决定让物品能够左右滑动以显示像panal这样的设置时,我的问题出现在它们下方(每个项目下面都有自己的设置,而不是所有项目的设置屏幕)有点交易)。我四处寻找不同的方法,但似乎无法找到一个有效的方法。我到目前为止所想的是在屏幕左侧或右侧的设置菜单中设置HorizonalScrollView我的项目,但当我将文本区域放在HorizonalScrollView时,它只是占据屏幕的一半,所以我可以并排放置两个,而不是我想要的,最终结果不会是我想象的。我真的想要一个允许设置在项目下的解决方案,所以当你把它推出时它会显示设置。

是否有更好的方法,或者我应该继续尝试让我的HorizonalScrollView工作,任何指导或思考我将如何做到这一点将不胜感激。

虽然我的应用程序看看我是否能找到类似的东西,但是gmail app有它。这是一个图像的链接,可以为您提供一个想法,在您将项目滑动到一侧后,它会在项目的位置显示撤消或归档按钮,就好像它们隐藏在您刷掉的列表项目下一样{{0 }}

1 个答案:

答案 0 :(得分: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;
        }
    }
}

然后使用topContent

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

请记住,我是用心输入所有这些代码,并且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;
    };
    };
}