2012-11-20 33 views
6

मेरे पास स्क्रॉल लागू होने के साथ एक कस्टम व्यू है, लेकिन यह छवि पर एक अंतराल स्क्रॉलिंग जैसा लगता है।
जब भी मुझे छवि का किनारा मिल जाता है, तब भी यह एक खाली पृष्ठभूमि में स्क्रॉलिंग रखता है।एंड्रॉइड समस्या: अंतहीन स्क्रॉलिंग के साथ देखें

मैं वेबव्यू का उपयोग नहीं कर सकता क्योंकि मेरे पास कुछ कैनवास sutff भी है।
क्या कोई इस मुद्दे के लिए सीमा निर्धारित करने के बारे में जानता है?
स्क्रॉलिंग के लिए छवि के किनारों को कैसे फिट करें?


संपादित करें: मुझे @ जोसेफएरल सहायता के साथ सबसे अच्छा समाधान मिला।
मैंने बस बाएं और शीर्ष सीमाएं सेट की हैं क्योंकि मेरी छवि स्क्रीन से बड़ी है।
इसके अलावा मैं ज़ूम funcionality का उपयोग करते समय सीमा बंद कर देता हूं, अन्यथा मैं इसे और स्थानांतरित नहीं कर सका।

1) अपने onTouch घटना, inser इस कोड के ACTION_MOVE मामले में: पर

if(!isZoomed) { 
    if(mPosX < 0) 
     mPosX = 0; 
    else if(mPosX > mWidth) 
     mPosX = mWidth; 
    if(mPosY < 0) 
     mPosY = 0; 
    else if(mPosY > mHeight) 
     mPosY = mHeight; 
} 


2) बारी या जब जूम प्रयोग किया जाता है सीमा बंद कर देते हैं।
अपने ACTION_POINTER_UP मामले में निम्न कोड जोड़ें:

case MotionEvent.ACTION_POINTER_UP: { 

    final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
    final int pointerId = ev.getPointerId(pointerIndex); 

    if (pointerId == mActivePointerId) { 
     final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
     mLastTouchX = ev.getX(newPointerIndex); 
     mLastTouchY = ev.getY(newPointerIndex); 
     mActivePointerId = ev.getPointerId(newPointerIndex); 
     isZoomed = true; 

    } else 
     isZoomed = false; 

    break; 

} 


और इतना ही है।
यहाँ सभी संबंधित विधियों और पूरा onTouch घटना है:

private float scaleFactor = 1.f; 
private ScaleGestureDetector detector; 

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

private float mPosX; 
private float mPosY; 
private float mLastTouchX; 
private float mLastTouchY; 

private float mWidth; 
private float mHeight; 
private boolean isZoomed = false; 

// OTHER CODE GOES HERE 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    detector.onTouchEvent(ev); 

    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; 
      mActivePointerId = ev.getPointerId(0); 
      break; 
     } 

     case MotionEvent.ACTION_MOVE: { 
      final int pointerIndex = ev.findPointerIndex(mActivePointerId); 
      final float x = ev.getX(pointerIndex); 
      final float y = ev.getY(pointerIndex); 

      if (!detector.isInProgress()) { 
       final float dx = x - mLastTouchX; 
       final float dy = y - mLastTouchY; 
       mPosX += dx; 
       mPosY += dy; 

       if(!isZoomed) { 
        if(mPosX < 0) 
         mPosX = 0; 
        else if(mPosX > mWidth) 
         mPosX = mWidth; 
        if(mPosY < 0) 
         mPosY = 0; 
        else if(mPosY > mHeight) 
         mPosY = mHeight; 
       } 

       invalidate(); 
      } 

      mLastTouchX = x; 
      mLastTouchY = y; 

      break; 
     } 

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

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

     case MotionEvent.ACTION_POINTER_UP: { 

      final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
      final int pointerId = ev.getPointerId(pointerIndex); 

      if (pointerId == mActivePointerId) { 
       final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
       mLastTouchX = ev.getX(newPointerIndex); 
       mLastTouchY = ev.getY(newPointerIndex); 
       mActivePointerId = ev.getPointerId(newPointerIndex); 
       isZoomed = true; 

      } else 
       isZoomed = false; 

      break; 

     } 
    } 

    return true; 
} 

private class ScaleListener extends 
     ScaleGestureDetector.SimpleOnScaleGestureListener { 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     scaleFactor *= detector.getScaleFactor(); 
     scaleFactor = Math.max(MIN_ZOOM, Math.min(scaleFactor, MAX_ZOOM)); 
     invalidate(); 
     return true; 
    } 
} 

@Override 
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld){ 
    super.onSizeChanged(xNew, yNew, xOld, yOld); 
    mWidth = xNew; 
    mHeight = yNew; 
} 

// OTHER CODE GOES HERE 

उत्तर

2

यह अपने कोड से लगता है कि कोई बिंदु पर आप स्क्रॉल करने योग्य क्षेत्र के आकार का पता लगाने और उन सीमा की स्थिति को सीमित करने का प्रयास करते हैं , यानी आपको यह सुनिश्चित करने के लिए जांच करनी चाहिए कि mPosX और mPosY उनकी सीमाओं से अधिक न हों।

सिस्टम स्वचालित रूप से आपके कस्टम व्यू की स्थिति को सीमित नहीं करेगा, यह वह है जो आपको स्वयं करने की आवश्यकता है।

शीर्ष और बाएं बाउंड 0, 0 होगा - आपको यह सुनिश्चित करना चाहिए कि mPosX और mPosY इससे अधिक नहीं हैं।

दाएं बाउंड (कंटेनर दृश्य की चौड़ाई - स्क्रॉलिंग दृश्य की चौड़ाई) होगी - यह नकारात्मक होना चाहिए (यदि यह बड़ा है तो 0 होने के लिए दाएं बाएं सेट करें) और आपको यह सुनिश्चित करना चाहिए कि mPosX कम से कम नहीं है इस। निचला बाउंड होगा (कंटेनर की ऊंचाई - स्क्रॉलिंग दृश्य की ऊंचाई) - यह फिर से नकारात्मक होना चाहिए और आपको यह सुनिश्चित करना चाहिए कि mPosY उससे कम नहीं है।

सारांश में, जब स्पर्श घटना शुरू होता है सीमा की गणना:

// Calculate our bounds. 
int leftBound = 0; 
int topBound = 0; 
int rightBound = imageWidth - getWidth(); 
if (rightBound > 0) { 
    rightBound = 0; 
} 
int bottomBound = imageHeight - getHeight(); 
if (bottomBound > 0) { 
    bottomBound = 0; 
} 

कहाँ imageWidth और imageHeight चौड़ाई और ऊंचाई जो कुछ भी आप स्क्रॉल कर रहे हैं।

फिर स्क्रॉल करते हुए यह सुनिश्चित कर लें सीमा का पालन कर रहे हैं:

if (mPosX > leftBound) { 
    mPosX = leftBound; 
} else if (mPosX < rightBound) { 
    mPosX = rightBound; 
} 

if (mPosY > topBound) { 
    mPosY = topBound; 
} else if (mPosY < bottomBound) { 
    mPosY = bottomBound; 
} 
+0

है कि मैं कैसे करना है पता नहीं है क्या: पी –

+1

ऐसा करने के तरीके के बारे में जानकारी के साथ अपडेट किया। –

+0

अब छवि पर कोई स्क्रॉल नहीं है! :( –