如何检测Horizo​​ntalScrollView中的视图何时触及另一个视图?

时间:2013-12-23 18:15:33

标签: android scrollview

所以我试图像滚动视图一样创建iMovie,当滚动视图中的图像触摸白线时我想要回调(所以我可以更改大图像)。我怎么能这样做?

enter image description here

3 个答案:

答案 0 :(得分:7)

这个解决方案对我有用,而且这是我在对Horizo​​ntalScrollView的选项进行长期研究后能够得出的唯一解决方案。

  

ImageView lineImage =(ImageView)findViewById(R.id.yourImageViewIdOfWhiteLineImage);

然后在horizo​​ntalScrollView的onTouchListener

public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()){
    case MotionEvent.ACTION_MOVE:
     //get horizontal scroll view for images
    HorizontalScrollView parent=(HorizontalScrollView)v;
    //get linear layout for list of images
    LinearLayout wholeList=(LinearLayout)parent.getChildAt(0);
    int centerCord[] = new int[2];
    for(int idx=0;idx<wholeList.getChildCount();idx++){
        ImageView discoveredIv=(ImageView)wholeList.getChildAt(idx);
        discoveredTv.getLocationInWindow(centerCord);
        int discoveredX=centerCord[0];
        //set these (lineImage.getLeft()-20, lineImage.getLeft()+20) according to your 
        //requirement, the way it best suits you. You'll have to test in runtime, how your 
        //views come under the line and then set these.
        if(discoveredX >= lineImage.getLeft()-20 && discoveredX <= lineImage.getLeft()+20)
        {
            //you have a winner, take that image from imageView and set it wherever you want.
            //Your image is in discoveredIv
        }
    }
        return false;
    case MotionEvent.ACTION_UP:
        //It returns true to avoid fling effect, otherwise this method won't work.
        return true;
    }
return false;
}

这完全符合您的要求。但是我建议你在ACTION_UP情况下使用这个代码,因为如果你在ACTION_MOVE中进行所有这些计算,那么这个代码有可能使你的应用程序在滚动时变慢,而且,计算越多,应用程序的速度越慢。 所以,我建议在ACTION_UP中使用它。

您可以在两种情况下测试您的应用,并决定您希望使用此代码。

答案 1 :(得分:1)

为imageview设置OnTouchListener,然后你就可以实现下面的回调。事件参考将提供您需要的一切

public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
// event reference will give every co-ordinate that u need
return false;
 }

答案 2 :(得分:1)

您可能希望扩展滚动的父级,以便在触摸时在屏幕上报告其位置。我不确定你的屏幕截图是否有while线,图像卷轴或两者都滚动,所以我假设白线是固定的并且图像滚动(尽管你的解决方案可以相应调整)。

在滚动ImageViews的自定义视图中:

/* @return True if the event was handled, false otherwise. */  
public boolean onTouchEvent (MotionEvent event) {  
    switch(event.getActionMasked()) {  
        case MotionEvent.ACTION_MOVE: {  
            x = event.getRawX();  
            // This is the x-position on screen, compare to that of while line.

当手指移动时,您将拦截它的位置变化。我假设所有ImageView都在父容器中,水平滚动它们。如果您需要知道手指在哪个孩子上面盘旋,请查看上一个问题: how to get a view from an event coordinates in android?。使用这些方法,您可以在滚动ImageView与白线重叠时知道,并相应地更新大图。

希望这有帮助!