Problem mit Aufbau eines Formulars

  • 47 Antworten
  • Neuester Beitrag
Diskutiere Problem mit Aufbau eines Formulars im Android App Entwicklung im Bereich Betriebssysteme & Apps.
P

pyretta

Ambitioniertes Mitglied
ist das damit nicht getan?

Code:
Drawable mDrawable = image.getDrawable();
Wie muss das denn dann deklariert werden?
Muss das anders aussehen?

Also das mDrawable aus dieser Deklaration wird nur gelb unterkringelt. Das zweite mDrawable bei setBounds wird rot unterkringelt. (Falls das was hilft...)
 
S

swordi

Lexikon
wie schon öfters erwähnt. wenn du java grundlagen lernen würdest, würdest du sowas selbst sehen ;)

du deklarierst dein mdrawable im konstruktor => die variable is nur dort sichtbar

die methode später kennt mdrawable dann nicht.
 
L

Lilithian

Ambitioniertes Mitglied
Blind geschrieben und nicht getestet, aber so müsste auf jeden Fall dein rotes und gelbes unterkringeln weg sein. Wie swordi bereits geschrieben hat: Wenn du eine Variable nur im Konstruktor anlegst, kannst du sie auch nur dort benutzen.
Wie farblich markiert werden die Variablen oben als Klassenvariablen angelegt und dann im Konstruktor zugewiesen. So kannst du aus jeder Methode der Klasse auf sie zugreifen.


Code:
public class Zoom extends View {

        [COLOR=Red]private Drawable mDrawable;[/COLOR]
        [COLOR=RoyalBlue]private ImageView mImage;[/COLOR]
        private int zoomControler=200;
        
        public Zoom(Context context) {
           super(context);
           [COLOR=RoyalBlue]mImage[/COLOR] = (ImageView)findViewById(R.id.bild_id);
           [COLOR=Red]mDrawable[/COLOR] = mImage.getDrawable();
           setFocusable(true);
        }
        
        @Override
        protected void onDraw(Canvas canvas) {
           super.onDraw(canvas);
           mDrawable.setBounds((getWidth()/2)-zoomControler, (getHeight()/2)-zoomControler, (getWidth()/2)+zoomControler, (getHeight()/2)+zoomControler);
           mImage.draw(canvas);                      // eventuell muss hier auch mDrawable statt mImage hin
        }
        
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
          if(keyCode==KeyEvent.KEYCODE_DPAD_UP)// zoom in
            zoomControler+=10;
          if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN) // zoom out
            zoomControler-=10;
          if(zoomControler<10)
            zoomControler=10;
          invalidate();
          return true;
        }
    }
 
P

pyretta

Ambitioniertes Mitglied
super! Danke! Lilithian :thumbsup:

Keine Fehler und keine Warnungen mehr! :biggrin:

Werd das gleich mal auf meinem Samsung Galaxy ausprobieren :smile:.

Ich hab das ja mal wieder ganz anders versucht zu lösen...
Ich hab einfach die privats oben gelöscht und

Code:
 ImageView image = (ImageView) findViewById(R.id.bild_id);
 Drawable mDrawable = image.getDrawable();
unter

Code:
protected void onDraw(Canvas canvas) {
verschoben.

Dann hat es auch keine Warnungen und Fehler mehr angezeigt. Wäre aber bestimmt der falsche Weg gewesen.

Vielen Dank für deine Hilfe, Lilithian! :smile:
 
Zuletzt bearbeitet:
P

pyretta

Ambitioniertes Mitglied
Schade, das zoomt leider gar nix :unsure: ...

Ich hab ja aber auch (sehe ich erst jetzt *schäm*) gar kein DPAD auf diesem Handy. Geht ja anscheinend nur damit, oder? Oder könnte man das "KeyEvent" auch mit dem "MotionEvent" ersetzen?

Oder geht das multi-touch erst ab 2.1?
Und nur mit dem Code:
android - How can I get zoom functionality for images? - Stack Overflow
 
P

pyretta

Ambitioniertes Mitglied
Ich hab mir das jetzt nochmal ganz genau angeschaut... *seufz*

Ich glaub, ich mach ne Schmalspurversion bei der das Handy im Querformat einfach ein größeres Bild erhält bei dem man noch ein bisschen scrollen kann.

Ist zwar sch... aber fürs erste muss es wohl reichen.

Für das zoomen mit multi-touch habe ich mir grade folgendes Buch bestellt:
The Pragmatic Bookshelf | Hello, Android

Mal sehen ob ich dann ein Update mit Zoomfunktion fertig bekomme.

Nochmal vielen Dank Lilithian für deine Mühe, Hilfe und Erklärungen und deine Geduld vor allem.

Auch ein Dank an swordi. Du hast Recht, ohne gutes Buch gehts echt nicht.
 
S

swordi

Lexikon
einsicht ist der beste weg zur besserung - bei detailfragen wird dir hier sicher wieder gern geholfen
 
P

pyretta

Ambitioniertes Mitglied
Hallo,

ich hab es übrigens hinbekommen mit dem Multitouch.

Ich kann jetzt das Bild zoomen und draggen. Wichtig ist, dass man ein Projekt beginnt, das mindestens mit dem 2.1 SDK arbeitet.

Hier der Code für Interessierte:

Hauptactivity in der das Bild ist:

Code:
package de.img.zoom.multitouch;

import android.app.Activity;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.view.View.OnTouchListener;
import android.view.MotionEvent;
import android.util.FloatMath;
import android.util.Log;
import android.graphics.Matrix;
import android.graphics.PointF;

public class Ergebnis extends Activity implements OnTouchListener{
    /** Called when the activity is first created. */
    
    /** Deklarationen für Multitouch - Anfang*/
       private static final String TAG = "Touch";
       // These matrices will be used to move and zoom image
       Matrix matrix = new Matrix();
       Matrix savedMatrix = new Matrix();

       // We can be in one of these 3 states
       static final int NONE = 0;
       static final int DRAG = 1;
       static final int ZOOM = 2;
       int mode = NONE;

       // Remember some things for zooming
       PointF start = new PointF();
       PointF mid = new PointF();
       float oldDist = 1f;
       
       /** Deklarationen für Multitouch - Ende*/

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ergebnis);
        TextView link = (TextView) findViewById(R.id.hyperlink);
        link.setMovementMethod(LinkMovementMethod.getInstance());
        
        /** Hier ist ein Einschub von Multitouch - Anfang*/
        ImageView imgAustausch = (ImageView) findViewById(R.id.Bild_ID); //ImageView Variable in gesamter Activity nutzbar
        imgAustausch.setOnTouchListener(this);

        // ...
        // Work around a Cupcake bug
        matrix.setTranslate(1f, 1f);
        imgAustausch.setImageMatrix(matrix);
        /** Hier ist ein Einschub von Multitouch - Ende*/
        
        
        Bundle bundle = this.getIntent().getExtras();
        boolean rb1_status = bundle.getBoolean("rb1_status");//Wert bzw. Status des Radiobuttons "Frau" wird geholt
      boolean rb2_status = bundle.getBoolean("rb2_status");//Wert bzw. Status des Radiobuttons "Mann" wird geholt
       String alter_wert = bundle.getString("alter_wert");//String wird geholt
        int a = Integer.parseInt(alter_wert);//String wird in Zahl umgewandelt
        
        
       if (rb1_status == true) {            
                   if (a >= 0 && a <= 4) {
                imgAustausch.setImageResource(R.drawable.k_2_4);
                   }
                 else if (a >= 5 && a <= 8) {
                imgAustausch.setImageResource(R.drawable.k_5_6);
                }   
        }
    
        if (rb2_status == true) {
                    if (a >= 0 && a <= 4) {
                imgAustausch.setImageResource(R.drawable.k_2_4);
                }
                else if (a >= 5 && a <= 8) {
                imgAustausch.setImageResource(R.drawable.k_5_6);
                }
                 
        }
 
    
    /** Hier fängt der Multitouch Code an */
    
       @Override
       public boolean onTouch(View v, MotionEvent rawEvent) {
          WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);
          // ...
          ImageView imgAustausch = (ImageView) v;

          // Dump touch event to log
          dumpEvent(event);

          // Handle touch events here...
          switch (event.getAction() & MotionEvent.ACTION_MASK) {
          case MotionEvent.ACTION_DOWN:
             savedMatrix.set(matrix);
             start.set(event.getX(), event.getY());
             Log.d(TAG, "mode=DRAG");
             mode = DRAG;
             break;
          case MotionEvent.ACTION_POINTER_DOWN:
             oldDist = spacing(event);
             Log.d(TAG, "oldDist=" + oldDist);
             if (oldDist > 10f) {
                savedMatrix.set(matrix);
                midPoint(mid, event);
                mode = ZOOM;
                Log.d(TAG, "mode=ZOOM");
             }
             break;
          case MotionEvent.ACTION_UP:
          case MotionEvent.ACTION_POINTER_UP:
             mode = NONE;
             Log.d(TAG, "mode=NONE");
             break;
          case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) {
                // ...
                matrix.set(savedMatrix);
                matrix.postTranslate(event.getX() - start.x,
                      event.getY() - start.y);
             }
             if (mode == ZOOM) {
                float newDist = spacing(event);
                Log.d(TAG, "newDist=" + newDist);
                if (newDist > 10f) {
                   matrix.set(savedMatrix);
                   float scale = newDist / oldDist;
                   matrix.postScale(scale, scale, mid.x, mid.y);
                }
             }
             break;
          }

          imgAustausch.setImageMatrix(matrix);
          return true; // indicate event was handled
       }

       /** Show an event in the LogCat view, for debugging */
       private void dumpEvent(WrapMotionEvent event) {
          // ...
          String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
                "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
          StringBuilder sb = new StringBuilder();
          int action = event.getAction();
          int actionCode = action & MotionEvent.ACTION_MASK;
          sb.append("event ACTION_").append(names[actionCode]);
          if (actionCode == MotionEvent.ACTION_POINTER_DOWN
                || actionCode == MotionEvent.ACTION_POINTER_UP) {
             sb.append("(pid ").append(
                   action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
             sb.append(")");
          }
          sb.append("[");
          for (int i = 0; i < event.getPointerCount(); i++) {
             sb.append("#").append(i);
             sb.append("(pid ").append(event.getPointerId(i));
             sb.append(")=").append((int) event.getX(i));
             sb.append(",").append((int) event.getY(i));
             if (i + 1 < event.getPointerCount())
                sb.append(";");
          }
          sb.append("]");
          Log.d(TAG, sb.toString());
       }

       /** Determine the space between the first two fingers */
       private float spacing(WrapMotionEvent event) {
          // ...
          float x = event.getX(0) - event.getX(1);
          float y = event.getY(0) - event.getY(1);
          return FloatMath.sqrt(x * x + y * y);
       }

       /** Calculate the mid point of the first two fingers */
       private void midPoint(PointF point, WrapMotionEvent event) {
          // ...
          float x = event.getX(0) + event.getX(1);
          float y = event.getY(0) + event.getY(1);
          point.set(x / 2, y / 2);
       }    
    
    }
Dann zwei weitere Activitys anlegen: EclairMotionEvent und WrapMotionEvent.

Code EclairMotionEvent:


Code:
import android.view.MotionEvent;

public class EclairMotionEvent extends WrapMotionEvent {

   protected EclairMotionEvent(MotionEvent event) {
      super(event);
   }

   public float getX(int pointerIndex) {
      return event.getX(pointerIndex);
   }

   public float getY(int pointerIndex) {
      return event.getY(pointerIndex);
   }

   public int getPointerCount() {
      return event.getPointerCount();
   }

   public int getPointerId(int pointerIndex) {
      return event.getPointerId(pointerIndex);
   }
}
Code WrapMotionEvent:

Code:
import android.view.MotionEvent;

public class WrapMotionEvent {
   protected MotionEvent event;
   
   protected WrapMotionEvent(MotionEvent event) {
      this.event = event;
   }

   static public WrapMotionEvent wrap(MotionEvent event) {
      try {
         return new EclairMotionEvent(event);
      } catch (VerifyError e) {
         return new WrapMotionEvent(event);
      }
   }
   
   

   public int getAction() {
      return event.getAction();
   }

   public float getX() {
      return event.getX();
   }

   public float getX(int pointerIndex) {
      verifyPointerIndex(pointerIndex);
      return getX();
   }

   public float getY() {
      return event.getY();
   }

   public float getY(int pointerIndex) {
      verifyPointerIndex(pointerIndex);
      return getY();
   }

   public int getPointerCount() {
      return 1;
   }

   public int getPointerId(int pointerIndex) {
      verifyPointerIndex(pointerIndex);
      return 0;
   }

   private void verifyPointerIndex(int pointerIndex) {
      if (pointerIndex > 0) {
         throw new IllegalArgumentException(
               "Invalid pointer index for Donut/Cupcake");
      }
   }
   
}
Das ganze basiert auf diesem Buch: The Pragmatic Bookshelf | Hello, Android

Sehr zu empfehlen für Anfänger (mit Englischkenntnissen). :smile:

Liebe Grüße,
pyretta
 
Zuletzt bearbeitet:
Ähnliche Themen - Problem mit Aufbau eines Formulars Antworten Datum
1
3