summaryrefslogtreecommitdiffstats
path: root/src/com/android/calculator2/AlignedTextView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/calculator2/AlignedTextView.java')
-rw-r--r--src/com/android/calculator2/AlignedTextView.java86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/com/android/calculator2/AlignedTextView.java b/src/com/android/calculator2/AlignedTextView.java
new file mode 100644
index 0000000..1c4b78f
--- /dev/null
+++ b/src/com/android/calculator2/AlignedTextView.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.calculator2;
+
+import android.content.Context;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetEncoder;
+
+/**
+ * Extended {@link TextView} that supports ascent/baseline alignment.
+ */
+public class AlignedTextView extends TextView {
+
+ private static final String LATIN_CAPITAL_LETTER = "H";
+ private static final CharsetEncoder LATIN_CHARSET_ENCODER =
+ Charset.forName("ISO-8859-1").newEncoder();
+
+ // temporary rect for use during layout
+ private final Rect mTempRect = new Rect();
+
+ private int mTopPaddingOffset;
+ private int mBottomPaddingOffset;
+
+ public AlignedTextView(Context context) {
+ this(context, null /* attrs */);
+ }
+
+ public AlignedTextView(Context context, AttributeSet attrs) {
+ this(context, attrs, android.R.attr.textViewStyle);
+ }
+
+ public AlignedTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+
+ // Disable any included font padding by default.
+ setIncludeFontPadding(false);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ CharSequence text = getText();
+ if (TextUtils.isEmpty(text) || LATIN_CHARSET_ENCODER.canEncode(text)) {
+ // For latin text align to the default capital letter height.
+ text = LATIN_CAPITAL_LETTER;
+ }
+ getPaint().getTextBounds(text.toString(), 0, text.length(), mTempRect);
+
+ final Paint textPaint = getPaint();
+ mTopPaddingOffset = Math.min(getPaddingTop(),
+ (int) Math.floor(mTempRect.top - textPaint.ascent()));
+ mBottomPaddingOffset = Math.min(getPaddingBottom(),
+ (int) Math.floor(textPaint.descent()));
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ public int getCompoundPaddingTop() {
+ return super.getCompoundPaddingTop() - mTopPaddingOffset;
+ }
+
+ @Override
+ public int getCompoundPaddingBottom() {
+ return super.getCompoundPaddingBottom() - mBottomPaddingOffset;
+ }
+}