Skip to content

Instantly share code, notes, and snippets.

@cbedoy
Last active August 29, 2015 14:20
Show Gist options
  • Save cbedoy/06138f4992cfd7103803 to your computer and use it in GitHub Desktop.
Save cbedoy/06138f4992cfd7103803 to your computer and use it in GitHub Desktop.
un circulo feo
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