2011-10-25 60 views
4

似乎有很多關於如何在android上使用拖拽視圖的解決方案。如何在android上使用正確的拖拽視圖android

但是,它們要麼太慢或有問題。

一個已知的解決方案是有一個的FrameLayout,視圖簡單地改變其的LayoutParams隨着其移動使用OnTouchListener,如下所述: http://www.anddev.org/novice-tutorials-f8/android-drag-and-drop-of-normal-views-not-bitmaps-t13404.html 然而,如果視圖是一個ImageView的,達到當最右側(或最底部)的一側,圖像縮小。

另一種可能的解決方案是使用畫布,以顯示拖動的內容,如下所述: http://www.anddev.org/basic_drag_and_drop-t3095.html 不過,我不知道如何使用它的複雜視圖。

有誰知道一個好的解決方案,讓拖動視圖的大小保持不變,無論它在容器中的位置?

請幫幫我。

+0

@Trevor頁: 你覺得有哪些享受兩全其美的解決方案:無需擴展和ovverride任何方法,而不是限制的位置拖動的視圖? –

回答

12

下面是一個簡單的ImageView拖着一個完整的解決方案:

findViewById(R.id.imageView).setOnTouchListener(new OnTouchListener() 
    { 
    int prevX,prevY; 

    @Override 
    public boolean onTouch(final View v,final MotionEvent event) 
     { 
     final FrameLayout.LayoutParams par=(FrameLayout.LayoutParams)v.getLayoutParams(); 
     switch(event.getAction()) 
     { 
     case MotionEvent.ACTION_MOVE: 
      { 
      par.topMargin+=(int)event.getRawY()-prevY; 
      prevY=(int)event.getRawY(); 
      par.leftMargin+=(int)event.getRawX()-prevX; 
      prevX=(int)event.getRawX(); 
      v.setLayoutParams(par); 
      return true; 
      } 
     case MotionEvent.ACTION_UP: 
      { 
      par.topMargin+=(int)event.getRawY()-prevY; 
      par.leftMargin+=(int)event.getRawX()-prevX; 
      v.setLayoutParams(par); 
      return true; 
      } 
     case MotionEvent.ACTION_DOWN: 
      { 
      prevX=(int)event.getRawX(); 
      prevY=(int)event.getRawY(); 
      par.bottomMargin=-2*v.getHeight(); 
      par.rightMargin=-2*v.getWidth(); 
      v.setLayoutParams(par); 
      return true; 
      } 
     } 
     return false; 
     } 
    }); 
+0

使用這段代碼,動畫看起來不能反覆使用。如何重置佈局參數? – shkschneider

+1

@shkschneider爲了改變佈局參數,你做了我所做的 - 獲取當前的值,改變它們的值,然後再次使用setLayoutParams。無論如何,對於layoutParams上的動畫,您可以使用我製作的這個技巧:http:// stackoverflow。COM /問題/ 19519921 /如何對動畫-imageview的,從中心作物對填充的屏幕,和反之亦然-FAC –

2

我正在使用拖放當前項目,根據LayoutParams將各種View放在RelativeLayout之內。和你一樣,我發現Views在到達ViewGroup容器的右側或底部時會「縮小」。可能很明顯,這會發生,實際上,考慮到在測量和佈局階段,系統將確定給定的View突然將不得不比實際希望的更小的尺寸,如果它仍然是當靠近極端時能夠適合父母。

我現在做的一個非常簡單的解決方案是簡單地將我的ViewGroup相對於屏幕尺寸加大。

此外,你可以決定你其實不願意View s到出現部分關屏,在這種情況下,你會使用一些程序邏輯,以防止View對象的利潤率被設置使得View s爲允許離開父容器的邊界。

另一種解決方案可能是覆蓋onMeasure()或類似強迫孩子View迫使比父認爲是提供給它更大的尺寸 - 如果可能的話 - 迫使查看要在需要的尺寸放在那裏,重疊邊緣。這只是一個想法,但我還沒有調查過它。

+2

我找到了解決方案:只需將底部和右側邊距設置爲您拖動的imageView的大小的兩倍(高度和寬度相應)的負值即可。這是一種很冒險的方式,但它完美地起作用。 –

+0

如何只拖動垂直方向而不是全部區域 –

相關問題