llegar a 0, sonará una alarma • El contador no puede bajar de 0 ni ser mayor a 24 • Se puede iniciar, detener y resetear el reloj • Por defecto, debe tener un tamaño de 200x200dp Requerimientos
Se utiliza cuando se crean vistas manualmente, por código * @param context contexto en el cual se infla vista */ public ClockView(Context context) { this(context,null); } /** * Se utiliza cuando se crea la vista desde XML. * @param context * @param attrs */ public ClockView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } private void init(){ backgroundPaint = createPaintFromResource(R.color.colorPrimary); squarePaint = createPaintFromResource(R.color.green); gridPaint = createPaintFromResource(R.color.blue); activeTextPaint = createPaintFromResource(R.color.colorAccent); inactiveTextPaint = createPaintFromResource(R.color.colorInactive); if(!isInEditMode()) start();
Java 1 Child Parent Parent calculates MeasureSpecs and passes to child.onMeasure() 2 child.onMeasure() @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) AT_MOST X como máximo X EXACTLY X debe medir exactamente X UNSPECIFIED sin restricciones! spec { mode | size }
Java 1 Child Parent Parent calculates MeasureSpecs and passes to child.onMeasure() 2 setMeasuredDimension() @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ //la vista hija calcula cuan grande quiere //ser en base a los specs que recibe int measuredW = … int measuredH = ... setMeasuredDimension(measuredW, measuredH) } obligatorio!! Child calculates width / height; setMeasureDimension() 3
Java 1 Child Parent Parent calculates MeasureSpecs and passes to child.onMeasure() 2 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ //la vista hija calcula cuan grande quiere //ser en base a los specs que recibe int measuredW = … int measuredH = ... setMeasuredDimension(measuredW, measuredH) } obligatorio!! Child calculates width / height; setMeasureDimension() 3 child.getMeasuredWidth() child.getMeasuredHeight()
= resolveSize(defaultSize,widthMeasureSpec); int resolvedHeight = resolveSize(defaultSize,heightMeasureSpec); setMeasuredDimension(resolvedWidth,resolvedHeight); } } resolveSize public static int resolveSizeAndState(int size, int measureSpec, int state) { int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); final int result; switch (specMode) { case MeasureSpec.AT_MOST: if (specSize < size) result = specSize | MEASURED_STATE_TOO_SMALL; else result = size; case MeasureSpec.EXACTLY: result = specSize; case MeasureSpec.UNSPECIFIED: default: result = size; } return result | (state & MEASURED_STATE_MASK); } public static int resolveSize(int size, int measureSpec) { return resolveSizeAndState(size, measureSpec, 0) & MEASURED_SIZE_MASK; }
Repeat • Caster.IO Custom Views & View Groups • Android Docs Creating a View Class • Alberto Ballano (@aballano) Android layouts to the next level: Custom Views, Compound ViewGroups and Custom ViewGroups • Caren Chang (@calren24) Advanced Android Touches