दिलचस्प पोस्ट
कैसे सी # में JSON स्ट्रिंग बनाने के लिए जेथन और अजगर मॉड्यूल अजीब कमांड लाइन पैरामीटर कैसे प्राप्त करें? प्योर में एक फ़ाइल के साथ परिक्रमा के दौरान या फिर पर्ल में क्या अंतर है? Winforms के बीच चर पासिंग क्या मुझे एंड्रॉइड का उपयोग करना चाहिए: प्रक्रिया = "रिमोट" मेरे रिसीवर में? सेलेनियम का समर्थन करता है हेडलेस ब्राउज़र परीक्षण? बनाम लिनक के लिए – प्रदर्शन बनाम भविष्य एक टर्मिनल प्रोग्राम लिनक्स सी / सी ++ का क्लियरिंग आउटपुट विज़ुअल स्टूडियो 2015 टूटी रेजर इंटेलीसेंस मैं C ++ में एक स्ट्रिंग में एक डबल को कैसे रूपांतरित कर सकता हूं? पृष्ठ लोड पर ब्राउज़र ज़ूम स्तर कैसे बढ़ाएं? सभी ब्राउज़र के लिए विंडोज मीडिया प्लेयर को एम्बेड करना समानांतर प्रवाह, कलेक्टर और धागा सुरक्षा एंड्रॉइड: बिटमैप रीसायकल () यह कैसे काम करता है?

टच ईवेंट के साथ कैनवास में छवि

सरल लगता है, और फिर भी मुझे कार्यान्वयन के साथ समस्याएं आ रही हैं

मुझे स्क्रीन पर छवि के साथ एक कैनवास चाहते हैं जिसमें onTouch ईवेंट शामिल हैं onTouch मैंने ImageView की कोशिश की है लेकिन मैं कैनवास का उपयोग करने में सक्षम नहीं था। मैंने SurfaceView की कोशिश की और स्क्रीन पर कैनवास में छवि दिखाने में सक्षम था लेकिन मुझे टच इवेंट (ज़ूम, पैन) पर गति के साथ समस्या है।

मुझे कैनवास की ज़रूरत है क्योंकि मैं अपने कोड में छवि को रेंडर करूँगा।

क्या कोई मुझे यह करने का सही तरीका दिखा सकता है?

Solutions Collecting From Web of "टच ईवेंट के साथ कैनवास में छवि"

आप इसका उपयोग कर सकते हैं:

 import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; public class MyImageView extends View { private static final int INVALID_POINTER_ID = -1; private Drawable mImage; private float mPosX; private float mPosY; private float mLastTouchX; private float mLastTouchY; private int mActivePointerId = INVALID_POINTER_ID; private ScaleGestureDetector mScaleDetector; private float mScaleFactor = 1.f; public MyImageView(Context context) { this(context, null, 0); mImage = getResources().getDrawable(R.drawable.imagename); mImage.setBounds(0, 0, mImage.getIntrinsicWidth(), mImage.getIntrinsicHeight()); } public MyImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); } @Override public boolean onTouchEvent(MotionEvent ev) { // Let the ScaleGestureDetector inspect all events. mScaleDetector.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); // Only move if the ScaleGestureDetector isn't processing a gesture. if (!mScaleDetector.isInProgress()) { final float dx = x - mLastTouchX; final float dy = y - mLastTouchY; mPosX += dx; mPosY += dy; 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) { // 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; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); Log.d("DEBUG", "X: "+mPosX+" Y: "+mPosY); canvas.translate(mPosX, mPosY); canvas.scale(mScaleFactor, mScaleFactor); mImage.draw(canvas); canvas.restore(); } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { mScaleFactor *= detector.getScaleFactor(); // Don't let the object get too small or too large. mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f)); invalidate(); return true; } } }