我只是想绘制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>
答案 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个气泡并不断地绘制它们。