Android:如何使用画布创建视图,然后在活动中使用此视图

时间:2012-06-01 12:31:04

标签: android canvas

我必须使用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 方法的活动。

4 个答案:

答案 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

的布局中添加ID
<?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; (这意味着......)