如何在Android应用程序中用手指画东西。。。。并将其保存到web
**这涉及到为游戏编写精灵。。我不能适应它如何在Android应用程序中用手指画东西。。。。并将其保存到web,android,drawing,save,Android,Drawing,Save,**这涉及到为游戏编写精灵。。我不能适应它 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 androi
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>
有人能帮我吗?我觉得我很接近了-我使用
蓝球作为笔尖,我只是想“保存”它,可能我需要在XML页面上有一个按钮(或菜单)来执行此操作?我知道这有点像乞求,但网上有很多人问如何用手指画画,并将东西保存到“云”中,如果人们能给出代码示例(而不是参考资料),我保证我会将其编译成适当的教程代码,最终造福于所有人。包括我已经非常满意的PHP服务器端代码。我不确定您要完成“保存”的哪一部分,但我假设您正在询问如何将画布上绘制的内容存储到位图中
首先,为自己制作一个位图来绘制。喂,拉票。然后:
c.setBitmap(canvasBitmap);
这将存储绘制到“canvasBitmap”中的所有内容。然后,当用户按下按钮进行保存时:
savedBitmap = Bitmap.copy(canvasBitmap.getConfig(), true);
现在,将savedBitmap放到云中。希望对您有所帮助。您可以尝试使用谷歌提出的手势对象,尝试执行我的以下代码:
Activity1 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>
希望你会觉得这很有帮助。是的,这看起来很好,我明天会有一个适当的回答看它-我需要道歉onTouch MotionEvent也有一个问题-它不是“绘制”它只是在画布上拖动“光标蓝球”
,我还需要它“留下痕迹”@conners您仅在屏幕上拖动光标的原因是,您正在每一帧重新绘制画布的背景。您需要做的是调用c.drawARGB(255、210、210、210)代码>仅一次,而不是每帧。如果你删除了那行代码,你应该会看到你正在寻找的绘图结果。谢谢你,我明天会研究这个问题,然后再给你回复-看起来你是在建议我重写,但没关系。我很快会通知你的。(~24小时)我没有时间尝试您的代码来检查错误,但我知道我已经使用我的解决方案在Android应用程序中保存了客户端签名,它的工作方式就像一个符咒:)。因此,如果它有用的话,我会与你分享它。STOPPRESS*我让它按我需要的方式工作(做了实质性的更改,但基本上仍然使用你的代码),我能够完全删除“Activity2”,并使用click listener通过内部存储来发布手势图像。我会在整理好后发布“howto”。嗨,我已经在这个博客上传了我从中得到的答案
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();
}
}
});
}
}
<?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>
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));
}
}