10

**此问题已成功回答并已成为博客文章 <- 点击**

嗨,我是一名 PHP 开发人员,我想做一件简单的事情 - 我想在 Android 手机的空白页面上绘制一些东西(用一根带有较大“模拟笔尖”的手指)并将位图存储为 jpeg通过 http 发布服务器。

这是我到目前为止所拥有的,但这是从一个涉及为游戏编写精灵的教程中获取的。我无法适应它

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;
    }
}

这是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>

有人可以帮帮我吗?我觉得我很接近 - 我将它blueball用作笔尖,我只是想“保存”它,可能我需要在 XML 页面上有一个按钮(或菜单)来执行此操作?我知道这有点乞求,但有很多人在网上询问如何用手指绘图并将某些内容保存到“云”,如果人们可以用代码示例(不是参考)做出回应,我保证我会编译这个为所有人最终受益的适当的教程代码。包括我已经非常满意的 PHP 服务器端代码。

4

2 回答 2

10

您可以尝试使用 Google 提出的 Gesture Object,尝试执行我的以下代码:

活动 1 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>

活动1 java:

包 com.testandroidproject;

导入 java.io.ByteArrayOutputStream;

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

公共类 Activity1 扩展 Activity {

    私人按钮 button_save;
    私有 GestureOverlayView 手势;

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

        设置内容视图(R.layout.main);

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

        button_save.setOnClickListener(new OnClickListener() {

            @覆盖
            公共无效 onClick(查看 arg0){
                尝试 {
                    位图gestureImg = gesture.getGesture().toBitmap(100, 100,
                            8、彩色.黑色);

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

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

                    intent.putExtra("draw", bArray);
                    开始活动(意图);

                } 捕捉(异常 e){
                    e.printStackTrace();
                    Toast.makeText(Activity1.this, "没有在字符串上绘制",
                            3000).show();
                }
            }
        });
    }

}

活动 2 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>

活动2 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));
    }

}

希望你会发现这很有帮助。

于 2012-07-24T13:57:48.613 回答
2

我不确定您要完成“保存”的哪一部分,但我假设您正在询问如何将您在画布上绘制的内容存储到位图。

首先,为自己制作一个位图以进行绘制。说,canvasBitmap。然后:

c.setBitmap(canvasBitmap);

这将存储已绘制到“canvasBitmap”中的所有内容。然后,当用户按下按钮进行保存时:

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

现在,获取 savedBitmap 并将其发射到云中。希望有帮助。

于 2012-07-24T13:37:31.670 回答