Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 18/04/13, 20:47:11
Array

[xs_avatar]
rebeN rebeN no está en línea
Usuario poco activo
 
Fecha de registro: oct 2010
Mensajes: 20
Tu operador: Movistar

Móvil que haga onClick y actualizar imagen con marca

Hola! La primera duda que tengo es que me he descargado la clase MarkableImageView desde Internet para poder añadir una marca a una imagen que ya tengo seleccionada. La clase es la siguiente:

Código:
public class MarkableImageView extends ImageView {
    private boolean checked = false;

    public MarkableImageView(Context context) {
        super(context);
    }

    public MarkableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MarkableImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
        invalidate();
    }

    public boolean isChecked() {
        return checked;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if(checked) {
            Bitmap check = BitmapFactory.decodeResource(
                    getResources(), R.drawable.checkbox_on_background);
            int width = check.getWidth();
            int height = check.getHeight();
            int marginWidth = (int)(canvas.getWidth()/15);
            int marginHeight = (int)(canvas.getHeight()/20);
            int x = canvas.getWidth() - width - marginWidth;
            //int y = canvas.getHeight() - height - margin;
            int y = marginHeight;
            canvas.drawBitmap(check, canvas.getWidth()-check.getWidth(), 1, new Paint());
        }
    }
}
Uso un Gridview para mostrar todas mis fotos y quiero dejar marcadas algunas. Uso un BaseAdapter para cargar los datos, aquí mi método getView():

Código:
    public View getView(int position, View convertView, ViewGroup parent) {
        MarkableImageView imageView;
        if(convertView == null) {
            imageView = new MarkableImageView(mContext);

            imageView.setLayoutParams(new GridView.LayoutParams((int)(Preferencias.anchoPantalla/3.5), (int)(Preferencias.altoPantalla/4)));
            
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

            
        } else {
            imageView = (MarkableImageView) convertView;
        }
        
        if(nivel == -1) {
            
            if(!Preferencias.getIdsImagenesSeleccionadasJuegoMemoria().isEmpty()) {
                if(Preferencias.getIdsImagenesSeleccionadasJuegoMemoria().size() > position) {
                    imageView.setImageResource(
                        Preferencias.imagenesTodas[Preferencias.getIdsImagenesSeleccionadasJuegoMemoria().get(position)]);
                }
            }
        } else if(nivel == 0) {
            if(!listaIdsDescubiertas.isEmpty()) {
                if(listaIdsDescubiertas.size() > position) {
                    imageView.setImageResource(Preferencias.imagenesTodasPequeñas[listaIdsDescubiertas.get(position)]);
                }        
            }
        } else { 
            switch(nivel) {
                case 1:
                    imageView.setImageResource(Preferencias.imagenesNivel1[position]);
                    break;
                case 2: 
                    imageView.setImageResource(Preferencias.imagenesNivel2[position]);
                    break;
            }
            
            if(!listaIdsDescubiertas.isEmpty()) {
                for(Integer pos : listaIdsDescubiertas) {
                    if(calcularPosicion(position, nivel) == pos) {
                        imageView.setChecked(true);
                    }
                        
                }
            }
        }
        
        return imageView;
    }
Todo funciona perfectamente pero el problema es que cuando empiezo a desplazarme por la pantalla se ve la marca en las fotos que yo quiero pero al dejar de tocar la pantalla en ciertas posiciones se quitan las marcas. Luego al tocar la pantalla de nuevo vuelve a aparecer. ¿Cómo puedo solucionarlo para que aparezcan siempre?

Mi segunda duda es que genero una cuadrícula donde cada imagen es de una clase llamada TileJuegoMemoria que extiendo de ImageView.

Código:
  for (int r = 0; r < rows; r++) {
            LinearLayout row = new LinearLayout(this);
            row.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.WRAP_CONTENT));
            row.setGravity(Gravity.CENTER);
            for (int c = 0; c < columns; c++) {
                TileJuegoMemoria tile = new TileJuegoMemoria(this, tilebackResource,
                        tilesImagenesRepetidas.get(position), position, sideLength, sideLength);
                
                tile.setClickable(true);
                tile.setId(position);
                tile.setOnClickListener(tileOnClickListener);
                
                row.addView(tile);
                position++;
            }
            memoryBoardLayout.addView(row);
        }
Añado cada objeto a un listener para poder hacer click sobre él. El Listener tiene su método onClick() así:

Código:
 tileOnClickListener = new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                
                TileJuegoMemoria tempTile = (TileJuegoMemoria) v;
                
                if (tempTile.getVisibility() == TileJuegoMemoria.INVISIBLE || (!tempTile.isBackVisible)) {
                    return;
                }

                int move = gameEngine.doMove(tempTile);
                if (move == -1) {
                    return;
                }
                gameEngine.selectedTile = tempTile;

                gameEngine.selectedTile.flipOver();
                
                // Para la segunda foto que se selecciona
                if (move == 2) {
                    final Handler handler = new Handler();
                    Timer t = new Timer();
                    t.schedule(new TimerTask() {
                        public void run() {
                            handler.post(new Runnable() {
                                public void run() {              
                                    TileJuegoMemoria precedentMoveselectedTile = gameEngine.movesArray[0];
                                    
                                    if (gameEngine.selectedTile.tileFace.equals(precedentMoveselectedTile.tileFace)) {   
                                        if(eliminarAcertados) {
                                            gameEngine.selectedTile.hide();
                                            precedentMoveselectedTile.hide();
                                        }
                                        
                                    } else {
                                        gameEngine.selectedTile.flipOver();
                                        precedentMoveselectedTile.flipOver();
                                        
                                        turnoJugador1 = !turnoJugador1;

                                    }
                                    
                                    gameEngine.clearMoveArray();
                                }
                            });
                        }
                    }, 1000);
                }
            }
    };
    }
El juego es para 2 jugadores donde por turnos se van tocando dos imágenes de la pantalla que van cambiando. Mi duda es de que manera podría hacerlo para que después del turno del jugador 1, fuese el ordenador quien hiciera click en dos imágenes al azar.
Había pensado donde genero las imágenes guardar en una lista las coordenadas de cada imagen para hacer un performClick() sobre ella. ¿Qué puedo hacer? Gracias!

Última edición por rebeN Día 19/04/13 a las 01:48:41.
Responder Con Cita


Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 18:47:37 (GMT +1)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /