Zoom in imageView

  • Antworten:1
pewPew
  • Forum-Beiträge: 1

11.03.2013, 19:17:45 via Website

Hallo Androidpit!

Ich programmiere derzeit eine App für eine Projektarbeit an der Uni. Leider habe ich mich etwas übernommen und komme nicht mehr weiter.
Es geht darum, dass ich ein Bild in ein ImageView lade und dann mit multitouch aus dem Bild ein und auszoomen möchte. Leider habe ich keinen blassen Schimmer wie man soetwas realisieren soll.

Gibt es dafür eine Klasse, die ich verwenden kann?

Ich bin unendlich dankbar für jeglichen Tipp!


Viele Grüße

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

11.03.2013, 19:35:20 via Website

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 :D 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}

Antworten