Last active
August 29, 2015 14:20
-
-
Save cbedoy/06138f4992cfd7103803 to your computer and use it in GitHub Desktop.
un circulo feo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package uaa.bedl.examenii; | |
/** | |
* Created by Bety on 07/04/2015. | |
*/ | |
import android.content.Context; | |
import android.graphics.Canvas; | |
import android.graphics.Color; | |
import android.graphics.Paint; | |
import android.graphics.PorterDuff; | |
import android.graphics.PorterDuffXfermode; | |
import android.util.AttributeSet; | |
import android.view.View; | |
//Heredas de una view, una view es un elemento cuadrado y tu vas a pintar en el | |
public class CirclesView extends View { | |
private Paint mFill; //El rellno del rectangulo | |
private Paint mColorRed; //ciruclño rojo | |
private Paint mColorGreen; //ciruclo verde | |
private Paint mColorBlue; //ciruclo azul | |
private Paint mRect; //un rectangulo | |
private int blue = 255; //el azul que se forma por (0,0,255) | |
private int green = 255; //el verde que se forma por (0,255,0) | |
private int red = 255;//el rojo que se forma por (255,0,0) | |
private int x; //pos una X | |
private int y; // pos una Y | |
private int radio = 500; //un radio random | |
float densidad; | |
private int colorSeleccionado; | |
public CirclesView(Context context) { | |
super(context); | |
inicializar(); | |
} | |
public CirclesView(Context context, AttributeSet attrs) { | |
super(context, attrs); | |
inicializar(); | |
} | |
public CirclesView(Context context, AttributeSet attrs, int defStyleAttr) { | |
super(context, attrs, defStyleAttr); | |
inicializar(); | |
} | |
private void inicializar() { | |
//Lo instancia este es con el que vas a pintar el cuadradito | |
//usas ANTI_ALIAS_FLAG para que se pinte bonitamente | |
//un default en blanco recuerda RGB Si lo incializo 255,255,255 es un #FFFFFF = Blaco | |
//Fill porque quiero se se pinte de color blanco pero relleno no los bordes | |
this.mRect = new Paint(Paint.ANTI_ALIAS_FLAG); | |
this.mRect.setColor(Color.WHITE); | |
this.mRect.setStyle(Paint.Style.FILL); | |
//Densidad de la pantalla la densidad es un numero que va de 1 a 8 no importa aqui :p | |
this.densidad = getResources().getDisplayMetrics().density; | |
mFill = new Paint(); | |
mColorRed = new Paint(); | |
mColorGreen = new Paint(); | |
mColorBlue = new Paint(); | |
} | |
//Los setters para poner o actualizar los colores desde los listeners | |
public void setRed(int color){ | |
this.red = color; | |
invalidate(); | |
} | |
public void setGreen(int color){ | |
this.green = color; | |
invalidate(); | |
} | |
public void setBlue(int color){ | |
this.blue = color; | |
invalidate(); | |
} | |
@Override | |
protected void onMeasure(int widthMeasureSpec, | |
int heightMeasureSpec) { | |
int ancho = calcularAncho(widthMeasureSpec); | |
int alto = calcularAlto(heightMeasureSpec); | |
setMeasuredDimension(ancho, alto); | |
} | |
//Son funciones para redimencionar los altos y anchos dinamicamente el definio eso | |
private int calcularAlto(int limitesSpec) { | |
int res = 200; // Alto por defecto 100 | |
int modo = MeasureSpec.getMode(limitesSpec); | |
int limite =MeasureSpec.getSize(limitesSpec); | |
if (modo == MeasureSpec.AT_MOST) { | |
res = limite; | |
} else if (modo == MeasureSpec.EXACTLY) { | |
res = limite; | |
} | |
return res; | |
} | |
//Son funciones para redimencionar los altos y anchos dinamicamente el definio eso | |
private int calcularAncho(int limitesSpec) { | |
int res = 300; // Ancho por defecto 200 | |
int modo = MeasureSpec.getMode(limitesSpec); | |
int limite =MeasureSpec.getSize(limitesSpec); | |
if (modo == MeasureSpec.AT_MOST) { | |
res = limite; | |
} else if (modo == MeasureSpec.EXACTLY) { | |
res = limite; | |
} | |
return res; | |
} | |
@Override | |
protected void onDraw(Canvas canvas) { | |
float w = this.getWidth(); //? esto es obvio no? | |
float h = this.getHeight(); //? esto es obvio no? | |
float cx = w / 2; //Lo dibides entre dos no se porque | |
float cy = h / 2; // igual aqui | |
float r = w / 15; //de tu ancho lo divides entre 15 | |
float tx = (float) (r * Math.cos(30 * Math.PI / 180)); //Esto es para definir la posicion en X de la interseccion de los circultos | |
float ty = (float) (r * Math.sin(30 * Math.PI / 180)); //Esto es para definir la posicion en Y de la interseccion de los circultos | |
float expand= densidad; | |
//Siempre que mandes a llamar un INDALITE, en automatico hace un ONDRAW osea este metodo se vuelve a llamar y cambia la vista, osea limpia y pinta todo de nuevo | |
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); | |
//Limpias el canvas ahciendo transparente :p | |
mFill.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD)); | |
//Esto es un tipo de formato para dibujar en open gl, desconozco pero lo puedes buscar aqui | |
// http://developer.android.com/reference/android/graphics/PorterDuffXfermode.html | |
//Con esto calculas la posicion en X y Y para pintar el rectangulo | |
float izquierda = this.getWidth() - 230 * this.densidad, | |
arriba = 90 * this.densidad, derecha = this | |
.getWidth() - 100 * this.densidad, | |
abajo = 150 * this.densidad; | |
//Aqui pintas el circulo creando el color de acuerdo a la fusion de los rgb | |
mRect.setColor(Color.rgb(red, green, blue)); | |
canvas.drawRect(izquierda - 88, arriba - 88, derecha, abajo - 88, mRect); | |
//drawRect(float left, float top, float right, float bottom, Paint paint) | |
//Draw the specified Rect using the specified paint. | |
// | |
//Aqui pintas el rojo circulo pero con ARGB es decir Alpha RGB - >> Alpha transparencia | |
mColorRed.setStyle(Paint.Style.FILL); | |
mColorRed.setColor(Color.argb(red, 255, 0, 0)); | |
mColorRed.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD)); | |
canvas.drawCircle(cx, cy - r, expand * r, mColorRed); | |
//Aqui pintas el verde circulo pero con ARGB es decir Alpha RGB - >> Alpha transparencia | |
mColorGreen.setStyle(Paint.Style.FILL); | |
mColorGreen.setColor(Color.argb(green, 0, 255, 0)); | |
mColorGreen.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD)); | |
canvas.drawCircle(cx - tx, cy + ty, expand * r, mColorGreen); | |
//Aqui pintas el azul circulo pero con ARGB es decir Alpha RGB - >> Alpha transparencia | |
mColorBlue.setStyle(Paint.Style.FILL); | |
mColorBlue.setColor(Color.argb(blue, 0, 0, 255)); | |
mColorBlue.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD)); | |
canvas.drawCircle(cx + tx, cy + ty, expand * r, mColorBlue); | |
//Los canvas.drawAlgo(Siempre le pasas una serie de parametros y luego un paint); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment