2013-09-27 50 views
2

在UIScrollView的Android中有没有相当于我可以滑动图片的地方。谢谢。Android有相当于UIScrollView吗?

对不起,我不是更具体。我需要向各个方向滑动。 Androids ScrollView不会这样做。我一直在使用一个可以工作的WebView,但它只能在4.0或更高版本上工作。


这就是我想出来的。我把我的ImageView放在一个WebView中,我在ImageView上分配了setOnTouchListener。它似乎运作良好。

web = new WebView(this); 
    web.setVerticalScrollBarEnabled(false); 
    web.setHorizontalScrollBarEnabled(false); 
    web.setBackgroundColor(Color.RED); 
    web.setId(100); 
    RelativeLayout.LayoutParams layoutForContainer = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    layoutForContainer.height = 300; 
    layoutForContainer.width = 300; 
    layoutForContainer.addRule(RelativeLayout.CENTER_IN_PARENT); 
    web.setLayoutParams(layoutForContainer);  
    layout.addView(web); 

    myImageView = new ImageView(this); 
    myImageView.setImageResource(R.drawable.myImage); 
    RelativeLayout.LayoutParams layoutForLargeImage = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    layoutForLargeImage.height = (int) 768; 
    layoutForLargeImage.width = (int) 1024; 
    myImageView.setLayoutParams(layoutForLargeImage); 
    web.addView(myImageView); 

    myImageView.setOnTouchListener(new View.OnTouchListener() { 
    float downX, downY; 
    int scrollByX, scrollByY; 
    public boolean onTouch(View view, MotionEvent event) { 
     float currentX, currentY; 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       downX = event.getX(); 
       downY = event.getY(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       currentX = event.getX(); 
       currentY = event.getY(); 
       scrollByX = (int)(downX - currentX); 
       scrollByY = (int)(downY - currentY); 

       myImageView.scrollBy(scrollByX, scrollByY); 
       downX = currentX; 
       downY = currentY; 

       break; 
     } 
     return true; 
    } 
}); 
+0

可能重复http://stackoverflow.com/questions/12479859/view-with-horizo​​ntal-and-vertical- pan-drag-and-pinch-zoom) – Shalmezad

回答

1

显然,有很多选择喜欢的UIScrollView,(1)你可以采取Horizo​​ntalScrollView(2)你可以采取Viewpager

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 

<WebView 
      android:id="@+id/webview" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" />     
</RelativeLayout> 
+0

ScrollView只支持垂直滚动。我需要向各个方向滚动。 – Bobby

+0

你拥有哪种类型的内容?我的意思是HTML数据或其他? –

+0

我只想要滚动一个ImageView。我把它放在一个WebView中,但它不能低于4.0。我一直在搞setOnTouchListener一个容器,它拥有很好地工作的ImageView,但我无法让ImageView变大,然后无论我在哪个容器中都有它。 – Bobby

0

你可以使用android中

<ScrollView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    > 

</ScrollView> 
+0

ScrollView只支持垂直滚动。我需要向各个方向滚动。 – Bobby

0

是没有做到这一点。使用ScrollView。 Here is the documentation

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:stretchColumns="1" 
    > 
    <!-- everything you already have --> 
</LinearLayout> 

+0

ScrollView只支持垂直滚动。我需要向各个方向滚动。 – Bobby

2

这个问题几乎一岁,但它在谷歌搜索对于这个问题上,所以我想我会添加一些细节。

如果您正在寻找一个可以滚动的通用单向视图,使用内置在ScrollView中的Android的其他答案将可以正常工作。然而,如果你想要iOS的UIScrollView的多方面,你将不得不设计/使用自定义视图(或使用黑客,如使用Web视图)。视图的示例实现可以做到这一点可以在一个相关的问题在这里找到:

View with horizontal and vertical pan/drag and pinch-zoom

然后根据你的口味,你可以根据需要进行修改,如无缩放此实现(只是平移):

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Rect; 
import android.view.*; 

public class MultiDirectionPanGroup extends ViewGroup { 

    private static final int INVALID_POINTER_ID = 1; 
    private int mActivePointerId = INVALID_POINTER_ID; 

    private float mPosX; 
    private float mPosY; 
    private Matrix mTranslateMatrix = new Matrix(); 
    private Matrix mTranslateMatrixInverse = new Matrix(); 

    private float mLastTouchX; 
    private float mLastTouchY; 

    private float mFocusY; 

    private float mFocusX; 

    private float[] mInvalidateWorkingArray = new float[6]; 
    private float[] mDispatchTouchEventWorkingArray = new float[2]; 
    private float[] mOnTouchEventWorkingArray = new float[2]; 


    public MultiDirectionPanGroup(Context context) { 
     super(context); 
     mTranslateMatrix.setTranslate(0, 0); 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     int childCount = getChildCount(); 
     for (int i = 0; i < childCount; i++) { 
      View child = getChildAt(i); 
      if (child.getVisibility() != GONE) { 
       child.layout(l, t, l+child.getMeasuredWidth(), t + child.getMeasuredHeight()); 
      } 
     } 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     int childCount = getChildCount(); 
     for (int i = 0; i < childCount; i++) { 
      View child = getChildAt(i); 
      if (child.getVisibility() != GONE) { 
       measureChild(child, widthMeasureSpec, heightMeasureSpec); 
      } 
     } 
    } 

    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     canvas.save(); 
     canvas.translate(mPosX, mPosY); 
     super.dispatchDraw(canvas); 
     canvas.restore(); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     mDispatchTouchEventWorkingArray[0] = ev.getX(); 
     mDispatchTouchEventWorkingArray[1] = ev.getY(); 
     mDispatchTouchEventWorkingArray = screenPointsToScaledPoints(mDispatchTouchEventWorkingArray); 
     ev.setLocation(mDispatchTouchEventWorkingArray[0], 
       mDispatchTouchEventWorkingArray[1]); 
     return super.dispatchTouchEvent(ev); 
    } 

    /** 
    * Although the docs say that you shouldn't override this, I decided to do 
    * so because it offers me an easy way to change the invalidated area to my 
    * likening. 
    */ 
    @Override 
    public ViewParent invalidateChildInParent(int[] location, Rect dirty) { 

     mInvalidateWorkingArray[0] = dirty.left; 
     mInvalidateWorkingArray[1] = dirty.top; 
     mInvalidateWorkingArray[2] = dirty.right; 
     mInvalidateWorkingArray[3] = dirty.bottom; 


     mInvalidateWorkingArray = scaledPointsToScreenPoints(mInvalidateWorkingArray); 
     dirty.set(Math.round(mInvalidateWorkingArray[0]), Math.round(mInvalidateWorkingArray[1]), 
       Math.round(mInvalidateWorkingArray[2]), Math.round(mInvalidateWorkingArray[3])); 

     location[0] *= mScaleFactor; 
     location[1] *= mScaleFactor; 
     return super.invalidateChildInParent(location, dirty); 
    } 

    private float[] scaledPointsToScreenPoints(float[] a) { 
     mTranslateMatrix.mapPoints(a); 
     return a; 
    } 

    private float[] screenPointsToScaledPoints(float[] a){ 
     mTranslateMatrixInverse.mapPoints(a); 
     return a; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     mOnTouchEventWorkingArray[0] = ev.getX(); 
     mOnTouchEventWorkingArray[1] = ev.getY(); 

     mOnTouchEventWorkingArray = scaledPointsToScreenPoints(mOnTouchEventWorkingArray); 

     ev.setLocation(mOnTouchEventWorkingArray[0], mOnTouchEventWorkingArray[1]); 

     final int action = ev.getAction(); 
     switch (action & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: { 
       final float x = ev.getX(); 
       final float y = ev.getY(); 

       mLastTouchX = x; 
       mLastTouchY = y; 

       // Save the ID of this pointer 
       mActivePointerId = ev.getPointerId(0); 
       break; 
      } 

      case MotionEvent.ACTION_MOVE: { 
       // Find the index of the active pointer and fetch its position 
       final int pointerIndex = ev.findPointerIndex(mActivePointerId); 
       final float x = ev.getX(pointerIndex); 
       final float y = ev.getY(pointerIndex); 

       final float dx = x - mLastTouchX; 
       final float dy = y - mLastTouchY; 

       mPosX += dx; 
       mPosY += dy; 
       mTranslateMatrix.preTranslate(dx, dy); 
       mTranslateMatrix.invert(mTranslateMatrixInverse); 

       mLastTouchX = x; 
       mLastTouchY = y; 

       invalidate(); 
       break; 
      } 

      case MotionEvent.ACTION_UP: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 

      case MotionEvent.ACTION_CANCEL: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 

      case MotionEvent.ACTION_POINTER_UP: { 
       // Extract the index of the pointer that left the touch sensor 
       final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
       final int pointerId = ev.getPointerId(pointerIndex); 
       if (pointerId == mActivePointerId) { 
        // This was our active pointer going up. Choose a new 
        // active pointer and adjust accordingly. 
        final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
        mLastTouchX = ev.getX(newPointerIndex); 
        mLastTouchY = ev.getY(newPointerIndex); 
        mActivePointerId = ev.getPointerId(newPointerIndex); 
       } 
       break; 
      } 
     } 
     return true; 
    } 

} 
[查看具有水平和垂直摇摄/阻力和捏变焦](的