3

こんにちは、私が置いた座標で線を引くことができる練習プロジェクトを行っています。画面には 2 つのテキストフィールドと 1 つのボタンしかありません。たとえば、これら 2 つのテキスト フィールドに「20」と「30」を入力して「描画」ボタンをクリックすると、アプリで (0,0) から (20,30) までの線を ANOTHER VIEW に描画します。問題は、ボタンをクリックすると、これらの 2 つのテキストフィールドの値が setCoordinates() 関数に渡されますが、ビューに線が表示されないことです。canvas.drawLine() 関数で座標 [0] と座標 [1] を 50 と 50 に変更しようとすると、線が表示されるので、invalidate() 関数が機能していないのではないでしょうか? とにかく、私の問題がどこにあるかを見つけるのを手伝ってください、ありがとう!!!!! これが私のコードです:

MazeBuilder.java

package com.example.maze;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.app.Activity;
import android.graphics.Color;

public class MazeBuilder extends Activity {

private DrawMaze drawMaze ;
private EditText editTextX;
private EditText editTextY;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    drawMaze = new DrawMaze(this);
    setContentView(R.layout.activity_maze_builder);
    editTextX = (EditText) findViewById(R.id.editText1);
    editTextY = (EditText) findViewById(R.id.editText2);



}

public void buildMaze(View view){

    final int x = getValue(editTextX);
    final int y = getValue(editTextY);

    drawMaze.setCoordinates(x, y);

}

private static int getValue (EditText text) {
    try {
        return Integer.parseInt(text.getText().toString());
    } catch (NumberFormatException ex) {
        return 0;
    }
}

}

DrawMaze.java

package com.example.maze;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class DrawMaze extends View{

private Paint paint = new Paint();

private int[] coordinates = new int[2];

//===============================Constructors==============================================
//
//  
public DrawMaze(Context context) {

    super( context );

}

public DrawMaze(Context context, AttributeSet attrs) {

    super( context, attrs );
}

public DrawMaze(Context context, AttributeSet attrs, int defStyle) {

    super( context, attrs, defStyle );
}

//===============================Initialize the color of line and background==========================================
//
//      
public void init(){

    paint.setColor(Color.BLACK);
    this.setBackgroundColor(Color.WHITE);
}

public void setCoordinates(int x, int y){
    coordinates[0] = x;
    coordinates[1] = y;

    invalidate();
}

@Override
protected void onDraw(Canvas canvas) {

    System.out.println("=============coordinates[0]:"+coordinates[0]+"================coordinates[1]:"+coordinates[1]+"========");
    canvas.drawLine(0, 0, coordinates[0] , coordinates[1] , paint);
}



}

activity_maze_builder.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MazeBuilder" >

<com.example.maze.DrawMaze

    android:id="@+id/relativeLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/relativeLayout1" />



<RelativeLayout
    android:id="@+id/relativeLayout1"
    android:layout_width="500dp"
    android:layout_height="50dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/editText2"
        android:layout_alignBottom="@+id/editText2"
        android:layout_centerHorizontal="true"
        android:text="Columns: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_toLeftOf="@+id/button1"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/editText2"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:onClick="buildMaze"
        android:text="Build" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_toLeftOf="@+id/textView1"
        android:ems="10" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/editText1"
        android:layout_alignBottom="@+id/editText1"
        android:layout_toLeftOf="@+id/editText1"
        android:text="Rows: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

4

1 に答える 1

2

それ以外の

drawMaze = new DrawMaze(this);

使用する

drawMaze = (DrawMaze)findViewById(R.id.relativeLayout2); 

しかし、下

setContentView()

その理由は、レイアウトでコンテンツ ビューを設定すると、レイアウトの DrawMaze ではなく、DrawMaze が使用されるためです。

drawMaze = new DrawMaze(this);

インスタンス化されたが、コンテンツ ビューに設定されていない

于 2013-09-15T22:48:47.343 に答える