No es un bug, es una característica no documentada

18/10/15

Programación multimedia. Segunda aplicación. Transparentando una imagen

Desarrolla una aplicación que aplique transparencia a una imagen, teniendo en cuenta que el método setAlpha() está obsoleto a partir de API 16 y que el método setImageAlpha() no es válido para API 8, solo a partir de API 11. Ambos métodos indican su valor por entero (0 transparente, 255 opaco).

La guía del Layout es la siguiente


Como siempre, mi Layout es un poco distinto, siendo así


Mi idea era crear una barra de porcentaje de 0 a 100 y que conforme fuera moviéndose la imagen modificara su transparencia, pero he tenido problemas para buscar la información para llevar a cabo esa idea (la acabaré haciendo más adelante), así que lo que he hecho es capturar un porcentaje de texto de 0 a 100, mostrar un mensaje de advertencia en caso de que se introduzca un número fuera de ese rango, y calcular el porcentaje introducido sobre la escala de transparencia de 0 a 255.

Los componentes usados son


El código programado para los eventos es este (en cuadrado la parte realizada por mí, lo demás está generado automáticamente).

package es.claver.inazio.transparencia;

import android.annotation.TargetApi;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

public class Transparencia extends AppCompatActivity {

    private Button btnConversor;
    private ImageView ordicuso;
    private EditText txtPorcentaje;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transparencia);
        btnConversor = (Button)findViewById(R.id.btnCambiar);
        btnConversor.setOnClickListener(new View.OnClickListener() {
            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void onClick(View v) {
                ordicuso = (ImageView)findViewById(R.id.imgOrdicuso);
                txtPorcentaje = (EditText)findViewById(R.id.txtPorcentaje);
                double p = Double.parseDouble(txtPorcentaje.getText().toString());

                if (p > 100 || p < 0){
                    Toast t = Toast.makeText(getApplicationContext(), "Valor de transparencia no permitido", Toast.LENGTH_SHORT);
                    t.show();
                }
                else{
                    double r = (255 / 100) * p;
                    int porcentaje = (int)Math.floor(r);
                    ordicuso.setImageAlpha(porcentaje);
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_transparencia, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Es importante recalcar que el número capturado para el porcentaje hay que hacerlo en double (o float, algo que permita trabajar con decimales) y luego parsear el resultado a un entero para cargarlo en el método de transparencia. El resultado sería algo tal que así.




Por cierto, la imagen es una vista de los ibones de Ordicuso. Aprovechad a visitarlos, es un paisaje precioso con formaciones espectaculares y por desgracia están desapareciendo…

Versión 2

Mejora la aplicación anterior para conseguir cambiar el color de fondo (método setBackgroundResource()).

La ayuda del ejercicio es este Layout, pero como siempre me lo saltaré a la torera…


Mi idea es generar un color aleatorio cada vez que se pulse el botón que acabo de insertar.

El layout quedará de la siguiente forma


Y el código para cambiarlo es:

package es.claver.inazio.transparencia;

import android.annotation.TargetApi;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.provider.CalendarContract;
import android.support.annotation.DrawableRes;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Layout;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class Transparencia extends AppCompatActivity {

    private Button btnConversor;
    private ImageView ordicuso;
    private EditText txtPorcentaje;
    private Button btnColor;
    private RelativeLayout relLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transparencia);
        btnConversor = (Button)findViewById(R.id.btnCambiar);
        btnConversor.setOnClickListener(new View.OnClickListener() {
            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void onClick(View v) {
                ordicuso = (ImageView)findViewById(R.id.imgOrdicuso);
                txtPorcentaje = (EditText)findViewById(R.id.txtPorcentaje);
                double p = Double.parseDouble(txtPorcentaje.getText().toString());

                if (p > 100 || p < 0){
                    Toast t = Toast.makeText(getApplicationContext(), "Valor de transparencia no permitido", Toast.LENGTH_SHORT);
                    t.show();
                }
                else{
                    double r = (255 / 100) * p;
                    int porcentaje = (int)Math.floor(r);
                    ordicuso.setImageAlpha(porcentaje);
                }
            }
        });

        // Código para cambiar color de fondo
        btnColor = (Button)findViewById(R.id.btnNuevoColor);
        btnColor.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                getWindow().setBackgroundDrawable(new ColorDrawable(Color.argb(Color.alpha(generarColor()), Color.red(generarColor()), Color.green(generarColor()), Color.blue(generarColor()))));

            }
        });
    }

    public int generarColor(){
        return (int)Math.random()*255+1;
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_transparencia, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Y cada vez que pulsemos el botón se modificará el color de la app.

0 comments:

Publicar un comentario