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快照。添加單選按鈕並不是必需的,我只想給用戶留下印象,如果他滾動的話就有更多的圖像。
但是,下面的快照是從其他應用程序,看起來像更加規範和更加順暢的工作並沒有圖像之間沒有滯後和轉型都如此順利。
如果你想實現一種圖像庫,最好使用ViewPager並在每個頁面上放置一個圖像。 – thetonrifles
ViewPager是否有頁面指示符? – casillas
默認情況下,它不包含指示器,但可以很容易地添加它。我可以提供一些示例代碼,但我需要一些時間來準備它。 – thetonrifles