Hab dir das mal aus meiner App rausgeschnitten. Kann sein dass es jetzt nicht funktioniert, weil irgendwo Abhängigkeiten sind. Musst du halt noch anpassen.
Das Blöde daran ist, dass man irgendwie den Zoom beschränken muss, damit das Bild nicht kleiner wird als das View selbst
hab ich nur bedingt hinbekommen. Wenn du ne Lösung dafür hast sag bescheid
MfG
1public class GameView extends View {
2 private Context context;
3 private int w, h;
4 private ScaleGestureDetector mScaleDetector;
5 public float mScaleFactor = 1.1f;
6 private float mLastTouchX;
7 private float mLastTouchY;
8 private int mActivePointerId;
9 private float mPosX;
10 private float mPosY;
11 private int INVALID_POINTER_ID;
12 private float height;
13 private float width;
14 private float MouseX;
15 private float MouseY;
16
17 public GameView(Context context, AttributeSet attrs) {
18 super(context, attrs);
19 this.context = context;
20 mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
21
22 }
23
24 @Override
25 public boolean onTouchEvent(MotionEvent ev) {
26 mScaleDetector.onTouchEvent(ev);
27 final int action = ev.getAction();
28 switch (action & MotionEvent.ACTION_MASK) {
29 case MotionEvent.ACTION_DOWN: {
30 L.d(this,"down");
31 final float x = ev.getX();
32 final float y = ev.getY();
33 mLastTouchX = x;
34 mLastTouchY = y;
35 mActivePointerId = ev.getPointerId(0);
36 break;
37 }
38
39 case MotionEvent.ACTION_UP: {
40 mActivePointerId = INVALID_POINTER_ID;
41 break;
42 }
43
44 case MotionEvent.ACTION_CANCEL: {
45 mActivePointerId = INVALID_POINTER_ID;
46 break;
47 }
48
49 case MotionEvent.ACTION_POINTER_UP: {
50 final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
51 final int pointerId = ev.getPointerId(pointerIndex);
52 if (pointerId == mActivePointerId) {
53 final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
54 mLastTouchX = ev.getX(newPointerIndex);
55 mLastTouchY = ev.getY(newPointerIndex);
56 mActivePointerId = ev.getPointerId(newPointerIndex);
57
58 }
59 invalidate();
60 break;
61 }
62
63 case MotionEvent.ACTION_MOVE: {
64 final int pointerIndex = ev.findPointerIndex(mActivePointerId);
65 MouseX = ev.getX(pointerIndex);
66 MouseY = ev.getY(pointerIndex);
67 final float dx = MouseX - mLastTouchX;
68 final float dy = MouseY - mLastTouchY;
69
70 if (mPosX + dx <= 0) {
71 if (mPosX <= mPosX + dx) {
72 mPosX += dx;
73 }
74 }
75 if (w - width * mScaleFactor < mPosX + dx) {
76 if (mPosX >= mPosX + dx) {
77 mPosX += dx;
78 }
79 }
80 if (mPosY + dy <= 0) {
81 if (mPosY <= mPosY + dy) {
82 mPosY += dy;
83 }
84 }
85 if (h - height * mScaleFactor < mPosY + dy) {
86 if (mPosY >= mPosY + dy) {
87 mPosY += dy;
88 }
89 }
90
91 mLastTouchX = MouseX;
92 mLastTouchY = MouseY;
93
94 invalidate();
95
96 break;
97 }
98 }
99 return true;
100
101 }
102
103 private class ScaleListener extends
104 ScaleGestureDetector.SimpleOnScaleGestureListener {
105 @Override
106 public boolean onScale(ScaleGestureDetector detector) {
107 mScaleFactor *= detector.getScaleFactor();
108 mScaleFactor = Math.max(minScaleFactor / 4,
109 Math.min(mScaleFactor, maxScaleFactor));
110 invalidate();
111 return true;
112 }
113 }
114}
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.