मेरे पास स्क्रॉल लागू होने के साथ एक कस्टम व्यू है, लेकिन यह छवि पर एक अंतराल स्क्रॉलिंग जैसा लगता है।
जब भी मुझे छवि का किनारा मिल जाता है, तब भी यह एक खाली पृष्ठभूमि में स्क्रॉलिंग रखता है।एंड्रॉइड समस्या: अंतहीन स्क्रॉलिंग के साथ देखें
मैं वेबव्यू का उपयोग नहीं कर सकता क्योंकि मेरे पास कुछ कैनवास 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
है कि मैं कैसे करना है पता नहीं है क्या: पी –
ऐसा करने के तरीके के बारे में जानकारी के साथ अपडेट किया। –
अब छवि पर कोई स्क्रॉल नहीं है! :( –