Intereting Posts
Есть ли Android-эмулятор Google Glass? Android – нажмите значок приложения ActionBar, создайте новый экземпляр активности Кнопка масштабируется до фонового изображения вместо содержимого Android AccountManager authToken и OAuth Вставка контактов в Android 2.2 Android Studio Gradle Fabric с настройками прокси-сервера «Невозможно подключиться к сети» Фоновые процессы случайным образом умирают, когда приложение работает на Samsung S3 Android Studio не может запускаться после установки Пусть NetworkImageView Volley отобразит локальные файлы изображений Использовать аннотации Android в пользовательском диалоговом классе Как избежать автоматического появления клавиатуры Android при запуске активности Как работает «? Android: attr / activatedBackgroundIndicator»? Использование API YouTube в фрагменте Crosswalk Не удалось разрешить все зависимости для конфигурации: _armv7DebugCompile ' Android ListView Adapter notifyDataSetInvalidated () vs notifyDataSetChanged ()

Получить координаты холста после масштабирования вверх / вниз или перетаскивания в андроид

Я разрабатываю приложение, в котором я вставляю изображения, рисую и рисую на холсте. Это приложение также может масштабировать вверх / вниз по холсту или перетаскивать его в другое место. Моя проблема: я не могу получить правильные координаты холста после масштабирования или перетаскивания холста. Я хочу рисовать пальцем после того, как холст масштабируется или перетаскивается, но не может найти нужное место, где я коснулся .. 🙁 Также я новая пчела. Вот код.

@Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); //canvas.translate(mPosX, mPosY); canvas.scale(mScaleFactor, mScaleFactor, super.getWidth() * 0.5f, super.getHeight() * 0.5f); mIcon.draw(canvas); for (Path path : listPath) { canvas.drawPath(path, paint); } canvas.restore(); } public TouchExampleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @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; } } float objectNewX,objectNewY; if (mScaleFactor >= 1) { objectNewX = ev.getX() + (ev.getX() - super.getWidth() * 0.5f) * (mScaleFactor - 1); objectNewY = ev.getY() + (ev.getY() - super.getHeight() * 0.5f) * (mScaleFactor - 1); } else { objectNewX = ev.getX() - (ev.getX() - super.getWidth() * 0.5f) * (1 - mScaleFactor); objectNewY = ev.getY() - (ev.getY() - super.getHeight() * 0.5f) * (1 - mScaleFactor); } if (ev.getAction() == MotionEvent.ACTION_DOWN) { path = new Path(); path.moveTo(objectNewX,objectNewY); path.lineTo(objectNewX,objectNewY); } else if (ev.getAction() == MotionEvent.ACTION_MOVE) { path.lineTo(objectNewX,objectNewY); listPath.add(path); } else if (ev.getAction() == MotionEvent.ACTION_UP) { path.lineTo(objectNewX,objectNewY); listPath.add(path); } return true; } 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, 5.0f)); invalidate(); return true; } } 

Solutions Collecting From Web of "Получить координаты холста после масштабирования вверх / вниз или перетаскивания в андроид"

Сделал это наконец сам.

Нарисуйте все, применив эту формулу к координатам (px, py):

 float px = ev.getX() / mScaleFactor + rect.left; float py = ev.getY() / mScaleFactor + rect.top; rect = canvas.getClipBounds(); //Get them in on Draw function and apply above formula before drawing 
 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); clipBounds_canvas = canvas.getClipBounds(); /////Do whatever you want to do..!!! }; @Override public boolean onTouchEvent(MotionEvent ev) { int x = ev.getX() / zoomFactor + clipBounds_canvas.left; int y = ev.getY() / zoomFactor + clipBounds_canvas.top; //Use the above two values insted of ev.getX() and ev.getY(); } 

Надеюсь, это поможет.