2011-10-31 11 views
0

HorizontalScrollViewに基づいて、私のカスタムビュー内で長押しを実装する際に問題が発生しました。Horizo​​ntalScrollViewの子アイテムで長押しが可能ですか?

HorizontalScrollViewには、子のビューがあるLinearLayoutがあります。ビューは、OnDraw()によってキャンバスにビットマップを描画します。

私はHorizontalScrollViewをスクロールさせることを許可したいと思います。しかし、画像の1つでユーザが(たとえスクロールしていても)指を保持すると、すぐにスクロールがキャンセルされ、ユーザは選択された画像で機能を実行することができる。 (この特定のケースでは、画面上でイメージを移動していますが、実際には何種類かの機能があります)。

イベントの処理には多くの組み合わせが試されています各レイヤー(HorizontalScrollViewおよびView)が、100%で動作するようには見えません。いくつかの組み合わせは、ほとんどの方法で取得し、いくつかの他の方法の一部ですが、彼らは常に1つの機能または別の(スクロール、ヒットテストなど)が欠落しているようです。

最も近いのはHorizontalScrollView'sonInterceptTouchEvent()の範囲内でfalseを返し、ViewのonTouch()イベント内で真となることです。これにより、スクロールが可能になり、ヒットテストがイメージに登録されます。しかし、すぐにコントロールをHorizontalScrollViewのonTouch()イベントに戻します。そのため、画像が数秒間押されたかどうかをチェックすることができません(長押し)。

ViewのonTouch()イベントでtrueを返した場合、ヒットテストが登録され、ユーザがACTION_MOVEの画像を長時間押したかどうかを確認できます。しかし、HorizontalScrollViewはスクロールしません。

私は完全に明白な何かを見逃していますか、あるいは一緒にうまく遊ばない2つのビューを選んだだけですか?どんな洞察にも感謝します。

答えて

0

右、

は、あなたがこれをソートしたりしていない場合は知らない、私は、ちょっとホいない場合、私は、あなたが求める何だと思う一緒にいくつかのビットをつぶしてきました。

私はこれが最善の方法ではないかもしれない、水平方向のスクロールでロードする活性を有しているが、それは私の作品:私が持っている

HolderActivityクラス(Horizo​​ntalScrollViewクラスのロード1):

int selectedItem; 
public boolean onLongClick(View v, int position) { 
    selectedItem = position; 
    openContextMenu(v); 
    return true; 
} 

public boolean onItemClick(int position) {)//do what you want here on click (press) 


@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
    ContextMenuInfo menuInfo) { 

    String[] menuItems = {"Menu item 1 text", "Cancel"}; 
    for (int i = 0; i<menuItems.length; i++) { 
     menu.add(Menu.NONE, i, i, menuItemsRemove[i]); 
    } 
    menu.setHeaderTitle("My menu title"); 
} 
私はそうのようにそこにコンテキストを通過し、あなたのHorizo​​ntalScrollViewクラスのコンストラクタパスで

:私は作成するための方法を持っている

public MyScroller(Context context) { 
    super(context); 
    this.context = context; 
} 

呼び出さsetFeatureItemsこれ等のArrayListからアイテム:リファレンスを有する

mGestureDetector = new GestureDetector(context, new MyGestureDetector()); 

そしてMyGestureDetectorネストされたクラス:このメソッド内

public void setFeatureItems(ArrayList<MyListEntity> items){} 

私はそうのように各項目にコンテキストを渡すGestureDetectorを追加します私はそれはGENER行っていない名残があるかもしれないので、私は、既存のprojからこれをカットしている

class MyGestureDetector extends SimpleOnGestureListener { 

     @Override 
     public void onLongPress(MotionEvent arg0) { 
      parentActivity.onLongClick(MyScroller.this, mActiveFeature); 
     }; 

     @Override 
     public boolean onSingleTapUp(MotionEvent arg0) { 
      parentActivity.onItemClick(mActiveFeature); 
      return true; 
     }; 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      try { 
       //right to left 
       if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        int featureWidth = getMeasuredWidth(); 
        mActiveFeature = (mActiveFeature < (mItems.size() - 1))? mActiveFeature + 1:mItems.size() -1; 
        smoothScrollTo(mActiveFeature*featureWidth, 0); 
        return true; 
       } 
       //left to right 
       else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        int featureWidth = getMeasuredWidth(); 
        mActiveFeature = (mActiveFeature > 0)? mActiveFeature - 1:0; 
        smoothScrollTo(mActiveFeature*featureWidth, 0); 
        return true; 
       } 
      } catch (Exception e) { 
        Log.e("Fling", "There was an error processing the Fling event:" + e.getMessage()); 
      } 
      return false; 
     } 
} 

:にすべての重要なparentActivityはこのようなものですic十分、私はこれが意味をなさないか、助けてくれることを願っています。詳細を追加できたら

関連する問題