代码之家  ›  专栏  ›  技术社区  ›  Johnny

如何在GameView中实现XML文本视图和按钮?

  •  0
  • Johnny  · 技术社区  · 9 年前

    在我开始之前,我试着看看其他类似的问题,但我不知道为什么xml告诉我gameview不存在。我知道我做错了什么,但我不知道是什么。


    我在XML中有一些按钮和文本视图,我希望能够在我的活动中使用它们,其中contentView设置为gameView。这可行吗?

    在我的xml中,我有四个按钮,它们都有一个onClick属性,它们发送(颜色),RGB或黄色。根据用户点击的内容,我希望将答案设置为不同的整数。如果他们的答案正确,我希望通过generateWWORD方法弹出新的颜色。然而,在我的xml中,我得到了错误

    “找不到以下类:-com.example.ali.colormatch2.surfaceview.Gameview, 即使我有一个GameView类。

    我的xml文件activity_color_match.xml:

    <?xml version="1.0" encoding="utf-8"?>
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_color_match"
    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="com.example.ali.colormatch2.ColorMatch2">
    
    <com.exmple.ali.colormatch2.surfaceview.GameView
        android:id="@+id/gameView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    <TextView
        android:text="@string/mainColor"
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:textColor="@android:color/background_dark"
        android:textSize="100dp"
        android:layout_marginBottom="104dp"
        android:textAppearance="@style/TextAppearance.AppCompat.Display3"
        android:layout_above="@+id/button3"
        android:layout_centerHorizontal="true" />
    
    <Button
        android:layout_width="150dp"
        android:layout_height="60dp"
        android:id="@+id/button"
        android:background="#000080"
        android:onClick="sendBlue"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
    
    <Button
        android:layout_height="60dp"
        android:id="@+id/button2"
        android:background="#ffff00"
        android:elevation="0dp"
        android:layout_width="150dp"
        android:onClick="sendYellow"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />
    
    <Button
        android:layout_width="150dp"
        android:layout_height="60dp"
        android:id="@+id/button3"
        android:background="@android:color/holo_red_dark"
        android:onClick="sendRed"
        android:layout_above="@+id/button"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="19dp" />
    
    <Button
        android:layout_width="150dp"
        android:layout_height="60dp"
        android:id="@+id/button4"
        android:background="@android:color/holo_green_dark"
        android:onClick="sendGreen"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignBottom="@+id/button3" />
    
    <TextView
        android:text="Score:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/textView4" />
    
    <TextView
    
        android:text="@string/matchText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView3"
        android:textAppearance="@style/TextAppearance.AppCompat.Body2"
        android:textSize="25dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />
    
    
    </RelativeLayout>
    

    package com.example.ali.colormatch2;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.widget.RelativeLayout;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.Random;
    
    public class ColorMatch2 extends Activity {
    
    // gameView will be the view of the game
    // It will also hold the logic of the game
    // and respond to screen touches as well
    GameView gameView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // Initialize gameView and set it as the view
        gameView = new GameView(this);
        setContentView(gameView);
        TextView textView3, textView2, textView4;
        textView3 = (TextView) findViewById(R.id.textView3);
        textView2 = (TextView) findViewById(R.id.textView2);
        textView4 =  (TextView) findViewById(R.id.textView4);
    
    }
    
    // GameView class will go here
    
    // Here is our implementation of GameView
    // It is an inner class.
    // Note how the final closing curly brace }
    
    // Notice we implement runnable so we have
    // A thread and can override the run method.
    class GameView extends SurfaceView implements Runnable {
    
        // This is our thread
        Thread gameThread = null;
    
        // This is new. We need a SurfaceHolder
        // When we use Paint and Canvas in a thread
        // We will see it in action in the draw method soon.
        SurfaceHolder ourHolder;
    
        // A boolean which we will set and unset
        // when the game is running- or not.
        volatile boolean playing;
    
        // A Canvas and a Paint object
        Canvas canvas;
        Paint paint;
    
        // This variable tracks the game frame rate
        long fps;
    
        // This is used to help calculate the fps
        private long timeThisFrame;
    
        //My variables
        int answer;
        int correctAnswer;
        int score = 0;
        int randomInt2, randomInt1;
        int count = 0;
        boolean matchColor = true, matchText = false, firstTime = true;
    
    
    
        // When the we initialize (call new()) on gameView
        public GameView(Context context) {
            // The next line of code asks the
            // SurfaceView class to set up our object.
            // How kind.,
            super(context);
    
            // Initialize ourHolder and paint objects
            ourHolder = getHolder();
            paint = new Paint();
    
            // Set our boolean to true - game on!
            playing = true;
    
        }
    
        @Override
        public void run() {
            while (playing) {
    
                // Capture the current time in milliseconds in startFrameTime
                long startFrameTime = System.currentTimeMillis();
    
                // Update the frame
                update();
    
                // Draw the frame
                draw();
    
                // Calculate the fps this frame
                // We can then use the result to
                // time animations and more.
                timeThisFrame = System.currentTimeMillis() - startFrameTime;
                if (timeThisFrame > 0) {
                    fps = 1000 / timeThisFrame;
                }
    
            }
    
        }
    
    
    public void update() {
            if (firstTime) {
                generateNewWord();
                firstTime = false;
            }
    
            if (answer == correctAnswer) {
                score++;
                count++;
                generateNewWord();
            }
            //else {
            //   quit();
            // }
    
    
            if (count % 5 == 0) {
                if (matchColor) {
                    textView3.setText(getString(R.string.gameSetting2)); // might need to add context with this - check http://stackoverflow.com/questions/10698945/reference-string-resource-from-code
                    matchText = true;
                    matchColor = false;
                } else if (matchText) {
                    textView3.setText(getString(R.string.gameSetting1));
                    matchColor = true;
                    matchText = false;
                }
            }
        }
    
    
        public void generateNewWord() {
            //randomly select between red, green, blue, yellow
            Random rand = new Random();
            randomInt1 = rand.nextInt(4) + 1; // assigns randomInt a value between 1 - 4
            randomInt2 = rand.nextInt(4) + 1;
    
            if (randomInt1 ==1){
                textView2.setText(R.string.Red);
            }
            else if (randomInt1 ==2){
                textView2.setText(R.string.Green);
            }
            else if (randomInt1 == 3){
                textView2.setText(R.string.Blue);
            }
            else if (randomInt1 == 4){
                textView2.setText(R.string.Yellow);
            }
    
    
            //randomly select hex codes between rgby
            if (randomInt2 ==1){
                textView2.setTextColor(0xffcc0000);
            }
            else if (randomInt2 ==2){
                textView2.setTextColor(0xff669900);
            }
            else if (randomInt2 == 3){
                textView2.setTextColor(0xff000080);
            }
            else if (randomInt2 == 4){
                textView2.setTextColor(0xffffff00);
            }
    
            if (matchColor) {
                correctAnswer = randomInt2;
            }
            else if(matchText){
                correctAnswer = randomInt1;
            }
        }
    
        // Draw the newly updated scene
        public void draw() {
    
            // Make sure our drawing surface is valid or we crash
            if (ourHolder.getSurface().isValid()) {
                // Lock the canvas ready to draw
                canvas = ourHolder.lockCanvas();
    
                // Draw the background color
                canvas.drawColor(Color.argb(255,  255, 255, 255));
    
                // Make the text a bit bigger
                paint.setTextSize(30);
    
                // Display the current score on the screen
                canvas.drawText("Score:" + score, 20, 40, paint);
    
    
                // Draw everything to the screen
                ourHolder.unlockCanvasAndPost(canvas);
            }
    
        }
    
        // If SimpleGameEngine Activity is paused/stopped
        // shutdown our thread.
        public void pause() {
            playing = false;
            try {
                gameThread.join();
            } catch (InterruptedException e) {
                Log.e("Error:", "joining thread");
            }
    
        }
    
        // If SimpleGameEngine Activity is started then
        // start our thread.
        public void resume() {
            playing = true;
            gameThread = new Thread(this);
            gameThread.start();
        }
    
    
        /*public void sendBlue(View view){
            answer = 2;
        }
        public void sendRed(View view){
            answer = 1;
        }
        public void sendYellow(View view){
            answer = 4;
        }
        public void sendGreen(View view){
            answer = 3;
        }*/
    
        //@Override
        public int getAnswer(MotionEvent motionEvent) {
    
            public void sendBlue(View view){
                answer = 2;
            }
            public void sendRed(View view){
                answer = 1;
            }
            public void sendYellow(View view){
                answer = 4;
            }
            public void sendGreen(View view){
                answer = 3;
            }
            return answer;
        }
    
    }
    
    // This is the end of our GameView inner class
    
    // More SimpleGameEngine methods will go here
    
    // This method executes when the player starts the game
    @Override
    protected void onResume() {
        super.onResume();
    
        // Tell the gameView resume method to execute
        gameView.resume();
    }
    
    // This method executes when the player quits the game
    @Override
    protected void onPause() {
        super.onPause();
    
        // Tell the gameView pause method to execute
        gameView.pause();
    }
    
    }
    

    我还想指出,我可能可以通过如下方式使用setTextView,但这并不能解决使用xml文件中的按钮的问题:

    public void draw() {
    
            // Make sure our drawing surface is valid or we crash
            if (ourHolder.getSurface().isValid()) {
                // Lock the canvas ready to draw
                canvas = ourHolder.lockCanvas();
    
                // Draw the background color
                canvas.drawColor(Color.argb(255,  255, 255, 255));
    
                // Make the text a bit bigger
                paint.setTextSize(30);
    
                // Display the current score on the screen
                canvas.drawText("Score:" + score, 20, 40, paint);
    
                if (randomInt2 ==1){
                    paint.setColor(Color.argb(255,  255, 0, 0));                }
                else if (randomInt2 ==2){
                    paint.setColor(Color.argb(255,  0, 191, 255));                }
                else if (randomInt2 == 3){
                    paint.setColor(Color.argb(255,  0, 128, 0));                }
                else if (randomInt2 == 4){
                    paint.setColor(Color.argb(255,  255, 255, 0));                }
    
    
                paint.setTextSize(60);
    
                if (randomInt1 ==1){
                    canvas.drawText("Red" , 100, 100, paint);
                }
                else if (randomInt1 ==2){
                    canvas.drawText("Green" , 100, 100, paint);
                }
                else if (randomInt1 == 3){
                    canvas.drawText("Blue" , 100, 100, paint);
                }
                else if (randomInt1 == 4){
                    canvas.drawText("Yellow" , 100, 100, paint);
                }
    
                // Draw everything to the screen
                ourHolder.unlockCanvasAndPost(canvas);
            }
    
        }
    

    这是我的字符串文件:

    <resources>
    <string name="app_name">ColorMatch</string>
    <string name="gameSetting1">Match the COLOR</string>
    <string name="gameSetting2">Match the TEXT</string>
    <string name="Red">Red</string>
    <string name="Green">Green </string>
    <string name="Blue">Blue</string>
    <string name="Yellow">Yellow</string>
    <string name="matchText">Test</string>
    <string name="mainColor">Test</string>
    <string name="score">Score:</string>
    
    </resources>
    

    编辑:感谢Nongthonbam Tonthoi,我找到了如何修复XML错误的方法。然而,在我现在为按钮代码单独的公共GameView类中,它表示这些方法从未使用过。我需要添加什么来修复这个问题,并确保当用户单击按钮时,它正确地更改了int-answer的值?

    按钮的代码。除了将它们从getAnswer方法中移除之外,我的GameView类的其余部分是相同的:

         public void sendBlue(View view){
            answer = 2;
         }
         public void sendRed(View view){
        answer = 1;
         }
         public void sendYellow(View view){
        answer = 4;
         }
         public void sendGreen(View view){
        answer = 3;
         }
    
    1 回复  |  直到 9 年前
        1
  •  0
  •   Nongthonbam Tonthoi    9 年前

    尝试更改此行:

    <com.exmple.ali.colormatch2.surfaceview.GameView
    

    致:

    <com.exmple.ali.colormatch2.GameView