0

我在自定义视图上绘制了一个自定义绘图。我想将此视图带到屏幕的下半部分而不更改 ondraw 函数的坐标。我知道这可以做到,但我做不到。请帮助我。

这是我的 XML 代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="0px"
        android:layout_weight="1" >

        <your.com.learn.game
            android:id="@+id/game1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="bottom" />
    </ScrollView>

</RelativeLayout>

游戏查看代码:

public class game extends View{
    private Bitmap image;
    private Paint paint;
    private int x=0;private int baseY = 250;

    public game(Context context,AttributeSet attr) {
        super(context,attr);

        //TODO Auto-generated constructor stub
        //LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        //layoutInflater.inflate(R.layout.example,this);

        //this.inflate(context, R.layout.example, null);
        image=Bitmap.createBitmap(BitmapFactory.decodeResource(this.getResources(),R.drawable.ic_launcher));
        paint =new Paint();
        paint.setColor(Color.BLUE);

    }

    public void onDraw(Canvas canvas)
        {
        super.onDraw(canvas);
        canvas.drawLine(90, baseY,200,baseY, paint);
        canvas.drawLine(125,baseY,125,baseY-100,paint);
        canvas.drawLine(110,baseY,125,baseY-15,paint);
        canvas.drawLine(140,baseY,125,baseY-15,paint);
        canvas.drawLine(125,baseY-100,175,baseY-100,paint);
        canvas.drawLine(125,baseY-85,140,baseY-100,paint);
        canvas.drawLine(175,baseY-100,175,baseY-75,paint);
        canvas.drawOval(new RectF(170,(baseY-75),10,12),paint);
        canvas.drawOval(new RectF(170,baseY-65,15,25), paint);
        canvas.drawLine(160,baseY-65,170,baseY-60,paint);
        canvas.drawLine(183,baseY-60,193,baseY-65,paint);
        canvas.drawLine(165,baseY-30,170,baseY-45,paint);
        canvas.drawLine(183,baseY-45,193,baseY-30,paint);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        final int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        final int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        boolean resizeWidth = widthSpecMode != MeasureSpec.UNSPECIFIED;
        boolean resizeHeight = heightSpecMode != MeasureSpec.UNSPECIFIED;
    }

    public void update()
    {
         if(x < 200)
                x++;
            else
                x=0;
    }
}

将游戏视图添加到嵌套 Scrollview 时的 Logcat(如下 Sam 所述):

07-05 18:53:09.638: W/dalvikvm(858): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
07-05 18:53:09.649: E/AndroidRuntime(858): FATAL EXCEPTION: main 
07-05 18:53:09.649: E/AndroidRuntime(858): java.lang.RuntimeException: Unable to start activity ComponentInfo{your.com.learn/your.com.learn.LearningActivity}: java.lang.NullPointerException 
07-05 18:53:09.649: E/AndroidRuntime(858): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
07-05 18:53:09.649: E/AndroidRuntime(858): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
07-05 18:53:09.649: E/AndroidRuntime(858): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
07-05 18:53:09.649: E/AndroidRuntime(858): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
07-05 18:53:09.649: E/AndroidRuntime(858): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-05 18:53:09.649: E/AndroidRuntime(858): at android.os.Looper.loop(Looper.java:123) 
07-05 18:53:09.649: E/AndroidRuntime(858): at android.app.ActivityThread.main(ActivityThread.java:3683) 
07-05 18:53:09.649: E/AndroidRuntime(858): at java.lang.reflect.Method.invokeNative(Native Method) 
07-05 18:53:09.649: E/AndroidRuntime(858): at java.lang.reflect.Method.invoke(Method.java:507) 
07-05 18:53:09.649: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
07-05 18:53:09.649: E/AndroidRuntime(858): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
07-05 18:53:09.649: E/AndroidRuntime(858): at dalvik.system.NativeStart.main(Native Method) 
07-05 18:53:09.649: E/AndroidRuntime(858): Caused by: java.lang.NullPointerException 
07-05 18:53:09.649: E/AndroidRuntime(858): at your.com.learn.LearningActivity.onCreate(LearningActivity.java:42) 
07-05 18:53:09.649: E/AndroidRuntime(858): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-05 18:53:09.649: E/AndroidRuntime(858): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
07-05 18:53:09.649: E/AndroidRuntime(858): ... 11 more


public class LearningActivity extends Activity  {
/** Called when the activity is first created. */

private game g;



int i=0;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    //For my button class
    /*
    MyButton myb = (MyButton)findViewById(R.id.mybutton1);
    myb.setText("Hello Students");
    myb.setTextSize(40);
   **/

    //For custom view
    setContentView(R.layout.main);
    //RelativeLayout r=(RelativeLayout) findViewById(R.id.relative1);
    g=new game(this,null);
    ViewGroup vgroup=(ViewGroup) findViewById(R.id.main);
     vgroup.addView(g);
    Thread mythread=new Thread(new UpdateThread());
    mythread.start();


}


public Handler updatehandler=new Handler(){
    /** Gets called on every message that is received */
    // @Override
    public void handleMessage(Message msg) {
       // g.update();

        g.invalidate();
         super.handleMessage(msg);

    }
};






public class UpdateThread implements Runnable
{

    public void run() {
        // TODO Auto-generated method stub
        while(true){
            //calling the handler
            LearningActivity.this.updatehandler.sendEmptyMessage(0);
        }

    }

}

}

4

2 回答 2

0

改写

我自己并没有在画布上画太多,但这里有一种方法可以让你当前的课程正常工作:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <org.whatever.example.game
        android:id="@+id/game1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</LinearLayout>

但是当我尝试将您的游戏视图嵌套在另一个视图中(比如 ScrollView)时,它不会绘制任何东西。我现在不知道为什么,但是上面的代码会让你继续下一步。希望有帮助!

于 2012-07-04T00:58:33.680 回答
0

尝试更改您的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <your.com.learn.game
            android:id="@+id/game1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true" />
    </ScrollView>

</RelativeLayout>

alingparentbottom属性会将您的自定义视图设置为底部。

于 2012-07-04T01:01:10.247 回答