我的Android应用程序即使没有错误也不起作用

时间:2018-04-09 00:00:44

标签: java android xml

我只是想绘制100个随机彩色的圆圈,但是我看到一圈圆圈大约半秒钟它就消失了。我试着自己解决了3个小时,但找不到线索。试过约束布局等。 你要注意,没有错误。 问题是什么?我认为这是因为布局我现在还不完全理解。帮助一个小绵羊编码器

Android java代码:

package com.example.seido.bubbledraw0408;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.util.AttributeSet;
import android.support.v7.widget.AppCompatImageView;
import android.widget.ImageView;

import java.util.ArrayList;

/**
 * Created by seido on 2018-04-08.
 */

 public class BubbleView extends AppCompatImageView {

    private ArrayList<Bubble> bubbleList;
    private final int DELAY = 16;
    private Paint myPaint = new Paint(); //allow us to draw
    private Handler h; // like Timer in eclipse
    private int size = 30;

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

        bubbleList = new ArrayList<Bubble>();
        myPaint.setColor(Color.WHITE);
        h = new Handler();

    }


    protected void onDraw(Canvas c){

        // just to test the ability to draw
        for(int x = 0; x < 100; x++)
            bubbleList.add(new Bubble((int)(Math.random() * 300),
                    (int)(Math.random() * 400), 50));


        // draw all the bubbles on the screen
        for(Bubble bubble : bubbleList) {
            myPaint.setColor(bubble.color);
            c.drawOval(bubble.x, bubble.y,
                    bubble.x, bubble.y, myPaint);
        }
    }

    public class Bubble {

        public int x;
        public int y;
        public int size;
        public int MAX = 5;
        public int xSpeed;
        public int ySpeed;
        public int color;

        Bubble(int newX, int newY, int newSize){

            x = newX;
            y = newY;
            size = newSize;
            color = Color.argb((int)(Math.random() * 256), (int)(Math.random() * 256) ,
                    (int)(Math.random() * 256), (int)(Math.random() * 256));

            xSpeed = (int)(Math.random() * 2 * MAX - MAX);
            ySpeed = (int)(Math.random() * 2 * MAX - MAX);

            if(xSpeed == 0 || ySpeed == 0) {
                xSpeed = 1;
                ySpeed = 1;
            }

        }

        public void randomMotion() {

            x += xSpeed;
            y += ySpeed;

            if(x <= size/2 || x >= getWidth() - size/2) {
                xSpeed = -1 * xSpeed;
            }
            if(y <= size/2 || y >= getHeight() - size/2) {
                ySpeed = -1 * ySpeed;
            }

        }


    }

}

XML代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom = "16dp"
android:background="#000000"
tools:context="com.example.seido.bubbledraw0408.BubbleView">

<com.example.seido.bubbledraw0408.BubbleView
    android:layout_width = "match_parent"
    android:layout_height = "match_parent" />

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

好的,我已经尝试了提供的代码,它按预期工作。虽然,我认为以下改进可能会为您的情况提供解决方案。

首先,在onDraw方法中填充气泡列表并不好 - 这种方法除了绘图之外什么都不做。 Bubble视图的初始化必须如下所示。另外,请注意我已覆盖View的所有可能的构造函数,这是一种更好的做法。

public BubbleView(Context context) {
    super(context);

    Initialize();
}

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

    Initialize();
}

public BubbleView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    Initialize();
}

private void Initialize() {
    bubbleList = new ArrayList<Bubble>();
    myPaint.setColor(Color.RED);
    h = new Handler();

    for(int x = 0; x < 100; x++)
        bubbleList.add(new Bubble((int)(Math.random() * 300),
                (int)(Math.random() * 400), 50));
}

接下来,onDraw将如下所示。请注意,在您提供的代码中,左侧和右侧,椭圆形的顶部和底部是相同的,所以我不知道您是如何看到任何内容的。

protected void onDraw(Canvas c){
    Log.d("Let me", "draw");

    // draw all the bubbles on the screen
    for(Bubble bubble : bubbleList) {
        myPaint.setColor(bubble.color);
        c.drawOval(bubble.x, bubble.y,
                bubble.x + bubble.size, bubble.y + bubble.size, myPaint);
    }
}

这至少会使你的代码变得更好。另外,你是多次调用onDraw吗?如果是这样,这段代码很可能会解决您的问题,因为您不会向阵列添加100个气泡并不断地绘制它们。