gpt4 book ai didi

java - 将位图添加到布局时,仅显示 for 循环中的第一个图像

转载 作者:行者123 更新时间:2023-12-01 18:16:14 25 4
gpt4 key购买 nike

上下文

我正在开发一个应用程序,在某个时刻,一堆图像会添加到屏幕上。这些图像存储在 SQLite 数据库中。

<小时/>

工作原理

我有一个 for 循环,它迭代每个拥有自己图像的实体。在循环内,我得到屏幕上的一个随机位置,在当前实体的图像旁边,我在该随机位置上添加了一个自定义View

<小时/>

问题

for 循环迭代从数据库收集的所有数据,正确获取坐标和图像,并且不会抛出Exception。然而,在主布局中,尽管正在对所有实体中的每个实体执行 addView ,但仅显示第一个实体的图像。出现的图像仅显示一次。

<小时/>

fragment

主要 Activity 方法:

// Método que establece el estado inicial de la aplicación
// TODO: Sólo se ve la cereza
private void estadoInicial()
{
// Recorremos cada fruta obtenida
for (int i = 0; i < this.contenedorFrutasOriginal.size(); i++)
{
// Obtenemos la fruta de la iteración actual
DTOFruta frutaActual = this.contenedorFrutasOriginal.get(i);

if (frutaActual.getImagen() != null)
{
// Obtenemos una posición aleatoria en la pantalla
DTOPunto posicionAleatoria = this.objLogicaVistas.ObtenerCoordenadaAleatoria(getWindowManager().getDefaultDisplay());


// Creamos una imagen a partir de la fruta
DTOImagen imagenFruta = new DTOImagen(this, new Paint(),
frutaActual.getImagen(), posicionAleatoria);

// Añadimos la imagen a la pantalla
this.layoutPrincipal.addView(imagenFruta);
}
}
}

从屏幕获取随机坐标的方法:

// Método que obtiene una coordenada aleatoria en la pantalla recibida
public DTOPunto ObtenerCoordenadaAleatoria(Display pantalla)
{
// Obtenemos el tamaño de la pantalla
Point tamanoPantalla = new Point();
pantalla.getSize(tamanoPantalla);

// Obtenemos unos valores para los ejes x e y aleatorios
float xAleatorio = new Random().nextFloat() * tamanoPantalla.x;
float yAleatorio = new Random().nextFloat() * tamanoPantalla.y;

// Creamos el punto aleatorio a partir de los valores obtenidos
return new DTOPunto(xAleatorio, yAleatorio);
}

在屏幕上绘制图像的类:

// Clase que representa una vista con una imagen
@SuppressLint("ViewConstructor")
public class DTOImagen extends View
{
// Atributos
private Paint brocha;
private byte[] imagen = null;
private DTOPunto coordenadas;

// Controladores
private boolean arrastrando;


// Propiedades
public Bitmap getImagenBitmap()
{
return BitmapFactory.decodeByteArray(this.imagen, 0, this.imagen.length);
}




// Constructor
public DTOImagen(Context context, Paint brocha, byte[] imagen, DTOPunto coordenadas)
{
super(context);

// Obtenemos los datos de la imagen
this.brocha = brocha;
if (imagen != null)
{
this.imagen = imagen;
}
this.coordenadas = coordenadas;

// Asignamos los controladores de la imagen
this.arrastrando = false;
}




// Método que controla las acciones a realizar al tocar la vista en pantalla
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event)
{
// Comprobamos el evento realizado
switch (event.getAction())
{
// Se ha tocado la pantalla
case MotionEvent.ACTION_DOWN:
// Obtenemos el hitbox de la vista
RectF hitbox = this.obtenerHitbox();

// Comprobamos si se ha tocado dentro del hitbox de la vista
if (hitbox.contains(event.getX(), event.getY()))
{
// La vista se va a arrastrar
this.arrastrando = true;
}
break;

// Se está arrastrando la vista
case MotionEvent.ACTION_MOVE:
// Comprobamos si se está arrastrando la vista
if (this.arrastrando)
{
// Actualizamos las coordenadas de la vista
this.coordenadas.setX(event.getX());
this.coordenadas.setY(event.getY());

// Invalidamos la vista para que se redibuje
this.invalidate();
}
break;

// Se ha dejado de tocar la vista
case MotionEvent.ACTION_UP:
// La imagen se deja de arrastrar
this.arrastrando = false;
break;
}

return true;
}


// Método que dibuja la vista
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas)
{
// Comprobamos que haya imagen
if (this.imagen != null)
{
// Dibujamos la imagen en las coordenadas correspondientes
canvas.drawBitmap(this.getImagenBitmap(), this.coordenadas.getX(),
this.coordenadas.getY(), this.brocha);
}
}




// Método que obtiene el hitbox de una imagen
private RectF obtenerHitbox()
{
// Obtenemos las mitades de la altura y ancho de la imagen
float ancho = this.getImagenBitmap().getWidth();
float altura = this.getImagenBitmap().getHeight();

// Obtenemos las paredes de la vista
float paredIzquierda = this.coordenadas.getX();
float paredDerecha = this.coordenadas.getX() + ancho;
float paredArriba = this.coordenadas.getY();
float paredAbajo = this.coordenadas.getY() + altura;

// Hitbox de la vista
return new RectF(paredIzquierda, paredArriba, paredDerecha, paredAbajo);
}
}

layoutPrincipal 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".capa_vistas.ActPrincipal">

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/fondo"
android:contentDescription="@null" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/layoutPrincipal"
android:orientation="vertical">

</LinearLayout>

</RelativeLayout>
<小时/>

调试

下图显示了 for 循环之后的 layoutPrincipal 子级: Layout children after adding viewsPD:DTOPunto是一个表示2D点的类,它只有几个float,用于X和Y轴值。
第二个 PD:在最后一次迭代中,我发现布局将所有以前的图像作为子项,因此看起来这些图像已正确添加。

最佳答案

更改此:

<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".capa_vistas.ActPrincipal">

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/fondo"
android:contentDescription="@null" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/layoutPrincipal"
android:orientation="vertical">

</LinearLayout>

</RelativeLayout>

对此:

<?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:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".capa_vistas.ActPrincipal">

<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@mipmap/fondo"
android:contentDescription="@null" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/layoutPrincipal"
android:orientation="vertical">

</LinearLayout>

</RelativeLayout>

你的图像就在那里,它只是占据了整个屏幕。当您开始滚动时(如果此布局位于可滚动的内部),您将看到它就在那里。

关于java - 将位图添加到布局时,仅显示 for 循环中的第一个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60361431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com