Auf eine Costum View zeichnen.

  • Antworten:0
Hans Peter
  • Forum-Beiträge: 13

10.04.2012, 14:29:57 via Website

Guten Tag,

ich habe mir für mein Projekt eine eigene View geschrieben welche ich in der XML-Datei einbinde. Diese View beinhaltet ein Drawable welches ein Bild aus den Ressourcen lädt. Diese View versteht Multitouch-Events, Zoom und verschieben des Bildes. Nun möchte ich gerne auf mein Drawable zeichnen. Damit meine ich wenn ich auf das Bild mit dem Finger drücke soll an dieser Stelle ein Bild entstehen. Nur leider steh ich gerade absolut auf dem Schlauch wie ich das machen könnte. Ein zuvor erzeugter Punkt soll bestehen bleiben wenn ein neuer markiert wird. Ebenso soll bei verschieben und zoomen des Bildes der Punkt an der richtigen Stelle bestehen bleiben.

Würde mich über ein Denkanstoß freuen. Am liebsten würde ich das Zeichnen des Punktes in eine extra Klasse packen da nachträglich noch mehrere Dinge gezeichnet werden müssen.

Hier mal meine View-Klasse:

1public class farbraumView extends ImageView {
2 private Drawable image;
3 private float mPosX;
4 private float mPosY;
5
6 private float mLastTouchX;
7 private float mLastTouchY;
8 private Context context;
9 private static final int INVALID_POINTER_ID = -1;
10
11 private int mActivePointerId = INVALID_POINTER_ID;
12 private ScaleGestureDetector mScaleDetector;
13 private float mScaleFactor = 1.f;
14 private boolean moved= false;
15
16 public farbraumView(Context context) {
17 this (context,null,0);
18 }
19
20 public farbraumView(Context context, AttributeSet attrs) {
21 this (context,attrs,0);
22 }
23
24 public farbraumView(Context context, AttributeSet attrs, int defStyle) {
25 super(context, attrs, defStyle);
26
27 this.context = context;
28
29 image = context.getResources().getDrawable(R.drawable.xyy);
30 image.setBounds(0,0, image.getIntrinsicWidth(), image.getIntrinsicHeight());
31
32 mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
33
34 }
35
36
37 @Override
38 protected void onDraw(Canvas canvas){
39 super.onDraw(canvas);
40
41 canvas.save();
42 canvas.translate(mPosX, mPosY);
43 canvas.scale(mScaleFactor, mScaleFactor);
44 image.draw(canvas);
45 canvas.restore();
46
47 }
48
49
50 @Override
51 public boolean onTouchEvent(MotionEvent ev) {
52 // Let the ScaleGestureDetector inspect all events.
53 mScaleDetector.onTouchEvent(ev);
54
55 final int action = ev.getAction();
56 switch (action & MotionEvent.ACTION_MASK) {
57 case MotionEvent.ACTION_DOWN: {
58 final float x = ev.getX();
59 final float y = ev.getY();
60
61 mLastTouchX = x;
62 mLastTouchY = y;
63
64 // Save the ID of this pointer
65 mActivePointerId = ev.getPointerId(0);
66 break;
67 }
68
69 case MotionEvent.ACTION_MOVE: {
70 // Find the index of the active pointer and fetch its position
71 final int pointerIndex = ev.findPointerIndex(mActivePointerId);
72 final float x = ev.getX(pointerIndex);
73 final float y = ev.getY(pointerIndex);
74
75 moved = true;
76 // Only move if the ScaleGestureDetector isn't processing a gesture.
77 if (!mScaleDetector.isInProgress()) {
78 final float dx = x - mLastTouchX;
79 final float dy = y - mLastTouchY;
80
81
82 mPosX += dx;
83 mPosY += dy;
84
85 mLastTouchX = x;
86 mLastTouchY = y;
87
88 invalidate();
89 }
90 break;
91 }
92
93 case MotionEvent.ACTION_UP: {
94 mActivePointerId = INVALID_POINTER_ID;
95
96 // nur wenn das Image nicht bewegt wird werden Werte ausgegeben
97 // Hierbei wir das DeltaX bzw. DeltaY sowie der Scale Factor beachtet
98
99 if (!moved){
100 float imageSizeX = image.getIntrinsicWidth();
101 float imageSizeY = image.getIntrinsicHeight();
102 float actX = ev.getX();
103 float actY = ev.getY();
104
105 float realY = Math.abs((actY-mPosY)-imageSizeY);
106
107 float yKoordinate = (float) (((realY/imageSizeY)*mScaleFactor)*0.9);
108 float xKoordinate = (float)((((actX-mPosX)/imageSizeX)*mScaleFactor)*0.8);
109
110 }
111 moved=false;
112 break;
113 }
114
115 case MotionEvent.ACTION_CANCEL: {
116 mActivePointerId = INVALID_POINTER_ID;
117 break;
118 }
119
120
121 case MotionEvent.ACTION_POINTER_UP: {
122 // Extract the index of the pointer that left the touch sensor
123 final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK)
124 >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
125 final int pointerId = ev.getPointerId(pointerIndex);
126 if (pointerId == mActivePointerId) {
127 // This was our active pointer going up. Choose a new
128 // active pointer and adjust accordingly.
129 final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
130 mLastTouchX = ev.getX(newPointerIndex);
131 mLastTouchY = ev.getY(newPointerIndex);
132 mActivePointerId = ev.getPointerId(newPointerIndex);
133 }
134 break;
135 }
136 }
137
138 return true;
139 }
140
141 private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
142 @Override
143 public boolean onScale(ScaleGestureDetector detector) {
144 mScaleFactor *= detector.getScaleFactor();
145
146 // Don't let the object get too small or too large. Standard: 0.1f / 5.0f
147 mScaleFactor = Math.max(0.5f, Math.min(mScaleFactor, 2.0f));
148
149 invalidate();
150 return true;
151 }
152
153
154 }}

— geändert am 10.04.2012, 14:31:08

Antworten