我必须使用canvas类在其上添加框架和多个图像。但我的问题是我必须在我的活动类中使用画布视图。我想将此画布视图用作小部件,以便我可以在我的XML中使用它。
我尝试使用此代码:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;
public class TwoDee extends View {
private int mWidth;
private int mHeight;
public TwoDee(Context context) {
super(context);
}
public TwoDee(Context context, AttributeSet attribs) {
super(context, attribs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.GRAY);
paint.setStyle(Style.FILL);
canvas.drawPaint(paint);
paint.setColor(Color.BLUE);
canvas.drawLine(0, 0, mWidth, mHeight, paint);
canvas.drawLine(mWidth, 0, 0, mHeight, paint);
paint.setColor(Color.RED);
canvas.drawText("0 kal", 50, 85, paint);
canvas.save();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mWidth = View.MeasureSpec.getSize(widthMeasureSpec);
mHeight = View.MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(mWidth, mHeight);
}
public void setImage(Drawable myImg) {
newImg = myImg;
invalidate();
}
}
并在我的xml类中使用它,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<com.yourapphere.TwoDee
android:id="@+id/twoDee1"
android:layout_width="150dp"
android:layout_height="100dp"
/>
</LinearLayout>
我在我的活动类中访问它,如下所示:
TwoDee myCanvas;
myCanvas = (TwoDee)findViewById(R.id.twoDee1);
myCanvas.setImage(drawable);
我的问题是,当我尝试从我的activity类中调用setImage()函数时,它会显示空指针异常。如何使用Activity类在画布视图中添加图像。
我不想使用setContentView
因为这只会使Canvas View显示在我的活动中。
LogCat输出:
FATAL EXCEPTION: main
java.lang.NullPointerException
at iTagz.android.Dialog_ImagePreview$1.onClick(Dialog_ImagePreview.java:84)
at android.view.View.performClick(View.java:2485)
at android.view.View$PerformClick.run(View.java:9081)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3770)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:638)
at dalvik.system.NativeStart.main(Native Method)
Dialog_ImagePreview 是我调用 SetImage 方法的活动。
答案 0 :(得分:1)
我从其他活动中调用了我的视图,这就是我收到NullPointerException的原因。但是现在我从相同的活动中调用它并且工作正常。
答案 1 :(得分:0)
仔细查看您的代码
<com.yourapphere.TwoDee
android:layout_width="150dp"
android:layout_height="100dp"
/>
你还没有写过id属性。它应该是
<com.yourapphere.TwoDee
android:id=@+id/twoDee1"
android:layout_width="150dp"
android:layout_height="100dp"
/>
答案 2 :(得分:0)
这是错误的。
我不想使用setContentView,因为这只会使Canvas View显示在我的活动中。
除非你没有指定setContentView,否则android将知道应该从哪个布局文件控件获取。
E.g
TwoDee myCanvas = (TwoDee) findViewById(R.id.twoDee1);
findViewById仅适用于在setContentView中指定布局文件的地方。
答案 3 :(得分:-1)
您错过了R.id.twoDee1
和/或setContentView()
。
在com.yourapphere.TwoDee
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<com.yourapphere.TwoDee
android:id="@+id/twoDee1"
android:layout_width="150dp"
android:layout_height="100dp"
/>
</LinearLayout>
然后在onCreate
:
setContentView(R.layout.yourxmlfile);
TwoDee myCanvas = (TwoDee) findViewById(R.id.twoDee1);
myCanvas.setImage(drawable);
更新
您必须致电setContentView
!我不知道你为什么不想覆盖完整的画布&#34; (这意味着......)