2016-02-23 84 views
0

我有以下xml。我從服務器獲取json對象並解析它們並在屏幕上顯示圖像。下面的XML和實現工作,但我的實現有一個問題。圖像頁面滾動轉換

我正在監聽圖像上的觸摸事件。如果觸摸事件的方向是左側,則顯示前一個圖像,如果是右側顯示下一個圖像。由於這個滾動視圖內的觸摸事件,性能方面並不令人滿意。它並不那麼流暢,有時在觸摸事件和滾動視圖之間混淆。

在我看來,我在這裏做火箭科學;因此,我開始認爲應該有更簡單的方法。

<ScrollView 
    android:id="@+id/my_scrollview" 
    android:layout_below="@id/imageLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scrollbars="horizontal" 
    android:fillViewport="true"> 

    <LinearLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:orientation="vertical"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="300dp" 
     android:layout_marginBottom="5dp"> 

     <com.android.volley.toolbox.NetworkImageView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:src="@drawable/blue" 
      android:adjustViewBounds="true" 
      android:id="@+id/detailImage" 
      android:scaleType="centerCrop"/> 

     <RadioGroup 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal|bottom" 
      android:orientation="horizontal" 
      android:id="@+id/radiogroup"> 
     </RadioGroup> 

    </FrameLayout> 

    </LinearLayout> 
</ScrollView> 

實現:

obj = new JSONObject(jsonObject); 
JSONObject images_JsonObject = obj.getJSONObject("images"); 
numberOfItems = images_JsonObject.length(); 
createRadioButton(numberOfItems); 

// parse json object 
Iterator<String> stringIterable = images_JsonObject.keys(); 
HashMap<String, String> hashMap = new HashMap<>(); 
list = new ArrayList<>(); 

while (stringIterable.hasNext()){ 
    String key = stringIterable.next(); 
    hashMap.put(key, images_JsonObject.getString(key)); 
    list.add(images_JsonObject.getString(key)); 
} 

//initial loading 
loadProductImage(list.get(0)); 
radioGroup.check(radioGroup.getChildAt(0).getId()); 
// touch event listener 
productImageView.setOnTouchListener(new View.OnTouchListener() { 

    private float downX, downY, upX, upY; 
    View v; 

    @Override 
     public boolean onTouch(View v, MotionEvent event) { 
     this.v = v; 
     switch (event.getAction()) { // Check vertical and horizontal touches 
     case MotionEvent.ACTION_DOWN: { 
      downX = event.getX(); 
      downY = event.getY(); 
      return true; 
     } 
     case MotionEvent.ACTION_UP: { 
      upX = event.getX(); 
      upY = event.getY(); 
      float deltaX = downX - upX; 
      float deltaY = downY - upY; 

     //HORIZONTAL SCROLL 
      if (Math.abs(deltaX) > Math.abs(deltaY)) { 
       if (deltaX < 0) { 
        this.onLeftToRightSwipe(); 
        return true; 
       } 
       if (deltaX > 0) { 
        this.onRightToLeftSwipe(); 
        return true; 
       } 
      } 
     return false; 
     } 
     } 
    return false; 
    } 

    public void onLeftToRightSwipe() { 
    selectedItem = mod(selectedItem - 1, 5); 
    radioGroup.check(radioGroup.getChildAt(selectedItem).getId()); 
    loadProductImage(list.get(selectedItem)); 
    } 

    public void onRightToLeftSwipe() { 
     selectedItem = mod(selectedItem + 1, 5); 
     radioGroup.check(radioGroup.getChildAt(selectedItem).getId()); 
     loadProductImage(list.get(selectedItem)); 
    } 
    }); 


// Add radio button programmatically 
private void createRadioButton(int nImages) { 
    final RadioButton[] rb = new RadioButton[nImages]; 
    radioGroup.removeAllViews(); 
    for(int i=0; i<nImages; i++){ 
     rb[i] = new RadioButton(this); 
     radioGroup.addView(rb[i]); 
     rb[i].setId(i); 
    } 
    } 

這裏是我的應用程序的UI快照。添加單選按鈕並不是必需的,我只想給用戶留下印象,如果他滾動的話就有更多的圖像。

enter image description here

但是,下面的快照是從其他應用程序,看起來像更加規範和更加順暢的工作並沒有圖像之間沒有滯後和轉型都如此順利。

enter image description here

+0

如果你想實現一種圖像庫,最好使用ViewPager並在每個頁面上放置一個圖像。 – thetonrifles

+0

ViewPager是否有頁面指示符? – casillas

+0

默認情況下,它不包含指示器,但可以很容易地添加它。我可以提供一些示例代碼,但我需要一些時間來準備它。 – thetonrifles

回答

2

您應該使用ViewPager的水平滾動的圖像。

Here它是Android文檔的參考。

Here on GitHub我把一個示例項目實現這個解決方案,使用自定義尋呼機指標和Picasso庫加載圖像。