2012-07-24 12 views
10

** ** THIS QUESTION WAS SUCCESSFULLY ANSWERED AND HAS BECOME A BLOG POST <- clickcómo dibujar algo con el dedo en una aplicación de Android .... y guardarlo en la web

Hola soy un desarrollador de PHP quiero hacer una cosa simple - Quiero dibuje algo dibujado en una página en blanco en un teléfono con Android (con un dedo con una "plumilla de pluma emulada" más grande) y almacene el mapa de bits como un jpeg en un servidor por http post.

Esto es lo que tengo hasta ahora, pero esto se toma de a tutorial que está involucrado con los sprites de escritura para un juego .. Y yo no puede adaptarlo

package com.my.example; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnTouchListener; 

public class DrawCapture extends Activity implements OnTouchListener{ 

    OurView v; 
    Bitmap ball; 
    float x,y; 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.draw_capture); 
     v = new OurView(this); 
     v.setOnTouchListener(this); 
     ball = BitmapFactory.decodeResource(getResources(), R.drawable.blueball); 
     x = y = 0; 
     setContentView(v); 
    } 

    @Override 
    protected void onPause(){ 
     super.onPause(); 
     v.pause(); 
    } 

    protected void onResume(){ 
     super.onResume(); 
     v.resume(); 
    } 

    public class OurView extends SurfaceView implements Runnable{ 
     Thread t = null; 
     SurfaceHolder holder; 
     boolean isItOK = false; 

     public OurView(Context context) { 
      super(context); 
      holder = getHolder(); 
     } 

     public void run() { 
      while (isItOK == true){ 

       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       //perform canvas drawing 
       if (!holder.getSurface().isValid()){ 
        continue; 
       } 
       Canvas c = holder.lockCanvas(); 
       onDraw(c); 
       holder.unlockCanvasAndPost(c); 
      }  
     } 

     public void onDraw(Canvas c){ 
      c.drawARGB(255, 210, 210, 210); 
      c.drawBitmap(ball, x - (ball.getWidth()/2), y - (ball.getHeight()/2), null); 
     } 

     public void pause(){ 
      isItOK = false; 
      while(true){ 
       try{ 
        t.join(); 
       } catch(InterruptedException e){ 
        e.printStackTrace(); 
       } 
       break; 
      } 
      t = null; 
     } 

     public void resume(){ 
      isItOK = true; 
      t = new Thread(this); 
      t.start(); 
     } 
    } 

    public boolean onTouch(View v, MotionEvent me){ 

     switch (me.getAction()){ 
      case MotionEvent.ACTION_DOWN : 
       x = me.getX(); 
       y = me.getY();    
       break; 
      case MotionEvent.ACTION_UP : 
       x = me.getX(); 
       y = me.getY();    
       break; 
      case MotionEvent.ACTION_MOVE : 
       x = me.getX(); 
       y = me.getY();    
       break; 
     } 
     return true; 
    } 
} 

y aquí está el código XML

<?xml version="1.0" encoding="utf-8"?> 
<SurfaceView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 


</SurfaceView> 

¿Alguien puede ayudarme? Siento que estoy cerca: uso el blueball como una pluma. Solo quiero "guardar" esto y posiblemente tendré que tener un botón (o menú) en la página XML para hacer esto. Sé que es un poco pesado pero hay mucho de personas en línea que me preguntan cómo dibujar con el dedo y guardar algo en la "nube" si las personas pueden responder con ejemplos del código (no referencias). Prometo que lo haré compilar esto en una pieza de código tutorial adecuado para el beneficio final de todos. Incluyendo el código del lado del servidor PHP con el que ya estoy muy contento.

Respuesta

10

Usted puede tratar de utilizar el objeto Gesto propuesto por Google, tratar de ejecutar mi siguiente código:

Actividad1 xml:

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#FFFFFF" > 

     <android.gesture.GestureOverlayView 
      android:id="@+id/gestures" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:fadeEnabled="false" 
      android:fadeOffset="5000000000" 
      android:gestureColor="#000000" 
      android:gestureStrokeType="multiple" 
      android:gestureStrokeWidth="1" 
      android:uncertainGestureColor="#000000" 
      android:layout_above="@+id/save_button" /> 

     <Button 
      android:id="@id/save_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:layout_centerHorizontal="true" 
      android:layout_marginBottom="20sp" 
      android:paddingLeft="20sp" 
      android:paddingRight="20sp" 
      android:text="Save" 
      android:textSize="22sp" /> 

    </RelativeLayout> 

Actividad1 java:

 package com.testandroidproject; 

import java.io.ByteArrayOutputStream; 

import android.app.Activity; 
import android.content.Intent; 
import android.gesture.GestureOverlayView; 
import android.graphics.Bitmap; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class Activity1 extends Activity { 

    private Button button_save; 
    private GestureOverlayView gesture; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     gesture = (GestureOverlayView) findViewById(R.id.gestures); 
     button_save = (Button) findViewById(R.id.save_button); 

     button_save.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       try { 
        Bitmap gestureImg = gesture.getGesture().toBitmap(100, 100, 
          8, Color.BLACK); 

        ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
        gestureImg.compress(Bitmap.CompressFormat.PNG, 100, bos); 
        byte[] bArray = bos.toByteArray(); 

        Intent intent = new Intent(Activity1.this, Activity2.class); 

        intent.putExtra("draw", bArray); 
        startActivity(intent); 

       } catch (Exception e) { 
        e.printStackTrace(); 
        Toast.makeText(Activity1.this, "No draw on the string", 
          3000).show(); 
       } 
      } 
     }); 
    } 

} 

Actividad2 xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#FFFFFF" 
    android:orientation="vertical" > 

    <ImageView 
     android:id="@+id/image_saved" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" /> 

</LinearLayout> 

Actividad2 java:

package com.testandroidproject; 

import java.io.ByteArrayInputStream; 

import android.app.Activity; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.widget.ImageView; 


public class Activity2 extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.display_image); 

     ImageView image = (ImageView) findViewById(R.id.image_saved); 

     ByteArrayInputStream imageStreamClient = new ByteArrayInputStream(
       getIntent().getExtras().getByteArray("draw")); 
     image.setImageBitmap(BitmapFactory.decodeStream(imageStreamClient)); 
    } 

} 

Esperamos que encuentre útil esta información.

+0

gracias, lo investigaré mañana y me pondré en contacto contigo, parece que estás sugiriendo que vuelva a escribir, pero está bien. Te actualizaré pronto (~ 24 horas) – conners

+0

No tengo tiempo para probar el código para verificar qué está mal, pero sé que he usado mi solución para guardar la firma del cliente en una aplicación de Android y funciona como un encanto :). Así que te lo comparto si puede ser útil. – grattmandu03

+0

* STOP * PRENSA * Lo tengo funcionando como lo necesito (con cambios sustanciales pero básicamente usando su código) pude eliminar completamente "Activity2" y usar el oyente click para hacer una publicación de la imagen del gesto a través de un interno almacenamiento. Publicaré el "howto" una vez que lo haya ordenado. – conners

2

No estoy seguro de qué parte del "guardar" está tratando de lograr, pero supongo que está preguntando cómo almacenar lo que ha dibujado en el lienzo a un mapa de bits.

Primero, hazte un mapa de bits para dibujar. Diga, canvasBitmap. Luego:

c.setBitmap(canvasBitmap); 

Esto almacenará todo lo que se ha dibujado en 'canvasBitmap'. Entonces, cuando el usuario presiona un botón para guardar:

savedBitmap = Bitmap.copy(canvasBitmap.getConfig(), true); 

Ahora, tome savedBitmap y el fuego apagado en la nube. Espero que ayude.

+0

Sí, esto se ve excelente Lo veré mañana con una respuesta adecuada - Tengo que disculparme porque también hay un problema con el OnTouch MotionEvent - no "DIBUJA" simplemente arrastra el "cursor' blueball'" alrededor del lienzo: también lo necesito para "dejar un rastro" – conners

+0

@conners La razón por la que solo está arrastrando el cursor por la pantalla es que está redibujando el fondo del lienzo en cada cuadro. Lo que necesita hacer es llamar 'c.drawARGB (255, 210, 210, 210);' solo una vez, no cada cuadro.Si elimina esa línea de código, debería ver el resultado del dibujo que está buscando. – TerryTate

Cuestiones relacionadas