Android编辑画布上的文本
我有一个editText,我想在画布上绘制输入的内容,画布上有我的资源“ger”。 我做了一个简单的代码,但在我看来,它无法工作。IDK问题是什么,当我运行它时,它意外停止 这是我的班级代码 公共类StartActivity扩展活动{Android编辑画布上的文本,android,bitmap,android-edittext,android-canvas,Android,Bitmap,Android Edittext,Android Canvas,我有一个editText,我想在画布上绘制输入的内容,画布上有我的资源“ger”。 我做了一个简单的代码,但在我看来,它无法工作。IDK问题是什么,当我运行它时,它意外停止 这是我的班级代码 公共类StartActivity扩展活动{ /** Called when the activity is first created. */ static Bitmap bmp; static EditText et; static ImageView iv; @Override public voi
/** Called when the activity is first created. */
static Bitmap bmp;
static EditText et;
static ImageView iv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EditText et = (EditText) findViewById(R.id.editText1);
ImageView iv = (ImageView) findViewById(R.id.imageView1);
Bitmap bmp = Bitmap.createBitmap(et.getDrawingCache());
}
public void onDraw (Canvas canvas){
try {
canvas.drawColor (Color.BLACK) ;
Bitmap ab = BitmapFactory.decodeResource(getResources(),(R.drawable.ger)) ;
ab = bmp;
canvas.drawBitmap ( ab , 0 , 0 , null ) ;
Paint paint = new Paint();
paint.setColor(Color.WHITE);
canvas.drawText(et.toString(),10,10,paint);
iv.setImageBitmap(bmp);
} catch ( Exception e ) {
e.printStackTrace ( ) ;
} catch ( Error e ) {
e.printStackTrace ( ) ;
}
}
}
日志:
08-17 22:51:03.526: D/AndroidRuntime(509): Shutting down VM
08-17 22:51:03.526: W/dalvikvm(509): threadid=1: thread exiting with uncaught exception (group=0x40015560)
08-17 22:51:03.547: E/AndroidRuntime(509): FATAL EXCEPTION: main
08-17 22:51:03.547: E/AndroidRuntime(509): java.lang.RuntimeException: Unable to start activity ComponentInfo{example.edittext.com/example.edittext.com.StartActivity}: java.lang.NullPointerException
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-17 22:51:03.547: E/AndroidRuntime(509): at android.os.Handler.dispatchMessage(Handler.java:99)
08-17 22:51:03.547: E/AndroidRuntime(509): at android.os.Looper.loop(Looper.java:123)
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-17 22:51:03.547: E/AndroidRuntime(509): at java.lang.reflect.Method.invokeNative(Native Method)
08-17 22:51:03.547: E/AndroidRuntime(509): at java.lang.reflect.Method.invoke(Method.java:507)
08-17 22:51:03.547: E/AndroidRuntime(509): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-17 22:51:03.547: E/AndroidRuntime(509): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-17 22:51:03.547: E/AndroidRuntime(509): at dalvik.system.NativeStart.main(Native Method)
08-17 22:51:03.547: E/AndroidRuntime(509): Caused by: java.lang.NullPointerException
08-17 22:51:03.547: E/AndroidRuntime(509): at android.graphics.Bitmap.createBitmap(Bitmap.java:367)
08-17 22:51:03.547: E/AndroidRuntime(509): at example.edittext.com.StartActivity.onCreate(StartActivity.java:27)
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-17 22:51:03.547: E/AndroidRuntime(509): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-17 22:51:03.547: E/AndroidRuntime(509): ... 11 more
xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.17"
android:src="@drawable/ger" />
</LinearLayout>
这里的问题是,您试图从缓存中创建一个
位图
。这不可能很顺利
你需要做的是这样的:
/** Called when the activity is first created. */
static Bitmap bmp;
static EditText et;
static ImageView iv;
static Canvas ivCanvas; // We'll be using our own Canvas.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EditText et = (EditText) findViewById(R.id.editText1);
ImageView iv = (ImageView) findViewById(R.id.imageView1);
// Move this up to onCreate
Bitmap ab = BitmapFactory.decodeResource(getResources(),(R.drawable.ger)) ;
bmp = convertToMutable(ab); // Initialize it here with the contents of ab. This effectively clones it and makes it mutable.
ab = null; // Dispose of ab.
ivCanvas = new Canvas(bmp); // Create our Canvas!
// Add a TextWatcher
et.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
updateCanvas(); // Call the canvas update
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s) {
}
});
}
public void updateCanvas() {
ivCanvas.drawColor (Color.BLACK) ;
ivCanvas.drawBitmap ( bmp , 0 , 0 , null ) ;
Paint paint = new Paint();
paint.setColor(Color.WHITE);
ivCanvas.drawText(et.getText().toString(),10,10,paint);
// Everything has been drawn to bmp, so we can set that here, now.
iv.setImageBitmap(bmp);
// Removed the "catch" blocks so you can actually know when you're getting errors! Feel free to re-add later.
}
我已经对此进行了彻底的评论,以便您能够理解我所做的更改。我认为这里需要进一步的更改,但这至少对您现在来说是可行的
编辑:
我已将代码转换为在TextWatcher
中使用。您可以从中找到有关基本实现的信息
编辑2:
您需要将
位图
转换为“可变”(可变)位图位图。您可以使用中找到的代码。我在上面添加了一个调用。您可以发布LogCat错误输出吗?另外,您可以显示XML在ger
的位置吗?为什么您要尝试捕捉错误
?抱歉,看看更新的问题。.我现在发布XML谢谢Eric,但我从中得到一个错误。onDraw方法onDraw(Canvas)未定义类型ActivityYeah,我想你会的。我已经更新了我的答案以使用TextWatcher
实现。谢谢你Eric,但现在我正在删除@override annotations错误,顺便说一句,accepted=)如果TextWatcher
给你带来错误,你可以安全地删除TextWatcher
的@Override
s