Improve performance of CheckmarkButtonView

pull/286/head
Alinson S. Xavier 9 years ago
parent 140ab34a76
commit 57296745b3

@ -25,7 +25,7 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
} }
debug { debug {
testCoverageEnabled = true testCoverageEnabled = false
} }
} }

@ -46,12 +46,12 @@ public class CheckmarkButtonViewTest extends BaseViewTest
public void setUp() public void setUp()
{ {
super.setUp(); super.setUp();
setSimilarityCutoff(0.03f); setSimilarityCutoff(0.015f);
latch = new CountDownLatch(1); latch = new CountDownLatch(1);
view = new CheckmarkButtonView(targetContext); view = new CheckmarkButtonView(targetContext);
view.setValue(Checkmark.UNCHECKED); view.setValue(Checkmark.UNCHECKED);
view.setColor(ColorUtils.getAndroidTestColor(7)); view.setColor(ColorUtils.getAndroidTestColor(5));
measureView(view, dpToPixels(40), dpToPixels(40)); measureView(view, dpToPixels(40), dpToPixels(40));
} }

@ -20,21 +20,34 @@
package org.isoron.uhabits.activities.habits.list.views; package org.isoron.uhabits.activities.habits.list.views;
import android.content.*; import android.content.*;
import android.content.res.*;
import android.graphics.*;
import android.support.annotation.*;
import android.text.*;
import android.util.*;
import android.view.*; import android.view.*;
import android.widget.*;
import org.isoron.uhabits.*; import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.habits.list.controllers.*; import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*; import org.isoron.uhabits.utils.*;
public class CheckmarkButtonView extends TextView import static android.view.View.MeasureSpec.*;
import static org.isoron.uhabits.models.Checkmark.*;
import static org.isoron.uhabits.utils.AttributeSetUtils.*;
public class CheckmarkButtonView extends View
{ {
private int color; private int color;
private int value; private int value;
private StyledResources res; private StyledResources styledRes;
private TextPaint paint;
private int lowContrastColor;
private RectF rect;
public CheckmarkButtonView(Context context) public CheckmarkButtonView(Context context)
{ {
@ -42,6 +55,21 @@ public class CheckmarkButtonView extends TextView
init(); init();
} }
public CheckmarkButtonView(@Nullable Context ctx, @Nullable AttributeSet attrs)
{
super(ctx, attrs);
init();
if(ctx == null) throw new IllegalStateException();
if(attrs == null) throw new IllegalStateException();
int paletteColor = getIntAttribute(ctx, attrs, "color", 0);
setColor(ColorUtils.getAndroidTestColor(paletteColor));
int value = getIntAttribute(ctx, attrs, "value", 0);
setValue(value);
}
public void setColor(int color) public void setColor(int color)
{ {
this.color = color; this.color = color;
@ -57,54 +85,60 @@ public class CheckmarkButtonView extends TextView
public void setValue(int value) public void setValue(int value)
{ {
this.value = value; this.value = value;
updateText(); postInvalidate();
} }
public void toggle() public void toggle()
{ {
value = (value == Checkmark.CHECKED_EXPLICITLY ? Checkmark.UNCHECKED : value = (value == CHECKED_EXPLICITLY ? UNCHECKED : CHECKED_EXPLICITLY);
Checkmark.CHECKED_EXPLICITLY);
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
updateText(); postInvalidate();
} }
private void init() @Override
protected void onDraw(Canvas canvas)
{ {
res = new StyledResources(getContext()); super.onDraw(canvas);
Resources resources = getResources();
paint.setColor(value == CHECKED_EXPLICITLY ? color : lowContrastColor);
int id = (value == UNCHECKED ? R.string.fa_times : R.string.fa_check);
String label = resources.getString(id);
float em = paint.measureText("m");
setWillNotDraw(false); rect.set(0, 0, getWidth(), getHeight());
rect.offset(0, 0.4f * em);
canvas.drawText(label, rect.centerX(), rect.centerY(), paint);
}
setMinHeight( @Override
getResources().getDimensionPixelSize(R.dimen.checkmarkHeight)); protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
setMinWidth( {
getResources().getDimensionPixelSize(R.dimen.checkmarkWidth)); Resources res = getResources();
int height = res.getDimensionPixelSize(R.dimen.checkmarkHeight);
int width = res.getDimensionPixelSize(R.dimen.checkmarkWidth);
setFocusable(false); widthMeasureSpec = makeMeasureSpec(width, EXACTLY);
setGravity(Gravity.CENTER); heightMeasureSpec = makeMeasureSpec(height, EXACTLY);
setTypeface(InterfaceUtils.getFontAwesome(getContext()));
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} }
private void updateText() private void init()
{ {
int lowContrastColor = res.getColor(R.attr.lowContrastTextColor); setFocusable(false);
if (value == Checkmark.CHECKED_EXPLICITLY) Resources res = getResources();
{ styledRes = new StyledResources(getContext());
setText(R.string.fa_check);
setTextColor(color); paint = new TextPaint();
} paint.setTypeface(InterfaceUtils.getFontAwesome(getContext()));
paint.setAntiAlias(true);
if (value == Checkmark.CHECKED_IMPLICITLY) paint.setTextAlign(Paint.Align.CENTER);
{ paint.setTextSize(res.getDimension(R.dimen.regularTextSize));
setText(R.string.fa_check);
setTextColor(lowContrastColor); rect = new RectF();
} color = ColorUtils.getAndroidTestColor(0);
lowContrastColor = styledRes.getColor(R.attr.lowContrastTextColor);
if (value == Checkmark.UNCHECKED)
{
setText(R.string.fa_times);
setTextColor(lowContrastColor);
}
} }
} }

@ -214,6 +214,7 @@ public class HabitCardView extends FrameLayout
scoreRing.setPercentage(rand.nextFloat()); scoreRing.setPercentage(rand.nextFloat());
checkmarkPanel.setColor(color); checkmarkPanel.setColor(color);
checkmarkPanel.setCheckmarkValues(values); checkmarkPanel.setCheckmarkValues(values);
checkmarkPanel.setButtonCount(5);
} }
private void refresh() private void refresh()

@ -74,4 +74,14 @@ public class AttributeSetUtils
if (number != null) return Float.parseFloat(number); if (number != null) return Float.parseFloat(number);
else return defaultValue; else return defaultValue;
} }
public static int getIntAttribute(@NonNull Context context,
@NonNull AttributeSet attrs,
@NonNull String name,
int defaultValue)
{
String number = getAttribute(context, attrs, name, null);
if (number != null) return Integer.parseInt(number);
else return defaultValue;
}
} }

Loading…
Cancel
Save