diff --git a/app/build.gradle b/app/build.gradle index ca57a11..4267140 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ android { minSdkVersion 23 targetSdkVersion 26 versionCode 1 - versionName "0.8.3" + versionName "0.8.4" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // Enabling multidex support. multiDexEnabled true diff --git a/app/src/main/java/com/chrhsmt/sisheng/MainApplication.kt b/app/src/main/java/com/chrhsmt/sisheng/MainApplication.kt index 80b33ba..1475052 100644 --- a/app/src/main/java/com/chrhsmt/sisheng/MainApplication.kt +++ b/app/src/main/java/com/chrhsmt/sisheng/MainApplication.kt @@ -1,7 +1,6 @@ package com.chrhsmt.sisheng import android.app.Application -import com.squareup.leakcanary.LeakCanary /** * Created by chihiro on 2017/11/03. @@ -9,6 +8,6 @@ import com.squareup.leakcanary.LeakCanary class MainApplication : Application() { override fun onCreate() { super.onCreate() - LeakCanary.install(this); + //LeakCanary.install(this); } } \ No newline at end of file diff --git a/app/src/main/java/com/chrhsmt/sisheng/ui/AutoResizeButton.kt b/app/src/main/java/com/chrhsmt/sisheng/ui/AutoResizeButton.kt new file mode 100644 index 0000000..bb1d407 --- /dev/null +++ b/app/src/main/java/com/chrhsmt/sisheng/ui/AutoResizeButton.kt @@ -0,0 +1,41 @@ +package com.chrhsmt.sisheng.ui + +import android.content.Context +import android.util.AttributeSet +import android.widget.Button + +/** + * フォントサイズ自動調整Button + * + * ソースコードは以下から借用 + * http://aillicepray.blogspot.jp/2015/02/textview.html + */ +class AutoResizeButton : Button { + + internal val info = AutoResizeUtils.AutoResizeInfo() + + /** + * コンストラクタ + * @param context + */ + constructor(context: Context) : super(context) {} + + /** + * コンストラクタ + * @param context + * @param attrs + */ + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { + //This method reads the parameters given in the xml file and sets the properties according to it + AutoResizeUtils.setModelText(attrs.getAttributeValue(null, "model_text"), info) + } + + /** + * 子Viewの位置を決める + */ + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + AutoResizeUtils.resize(this, info) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/chrhsmt/sisheng/ui/AutoResizeTextView.kt b/app/src/main/java/com/chrhsmt/sisheng/ui/AutoResizeTextView.kt index 9db61ce..5c59b93 100644 --- a/app/src/main/java/com/chrhsmt/sisheng/ui/AutoResizeTextView.kt +++ b/app/src/main/java/com/chrhsmt/sisheng/ui/AutoResizeTextView.kt @@ -1,12 +1,9 @@ package com.chrhsmt.sisheng.ui import android.content.Context -import android.graphics.Paint -import android.util.TypedValue import android.util.AttributeSet import android.widget.TextView - /** * フォントサイズ自動調整TextView * @@ -15,8 +12,7 @@ import android.widget.TextView */ class AutoResizeTextView : TextView { - internal var modelText: String? = null - internal var numberLine = 1 + internal val info = AutoResizeUtils.AutoResizeInfo() /** * コンストラクタ @@ -30,7 +26,8 @@ class AutoResizeTextView : TextView { * @param attrs */ constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - processAttributeSet(attrs) + //This method reads the parameters given in the xml file and sets the properties according to it + AutoResizeUtils.setModelText(attrs.getAttributeValue(null, "model_text"), info) } /** @@ -38,104 +35,7 @@ class AutoResizeTextView : TextView { */ override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { super.onLayout(changed, left, top, right, bottom) - resize() - } - - /** - * テキストサイズ調整 - */ - private fun resize() { - /** 最小のテキストサイズ */ - val MIN_TEXT_SIZE = 10f - - val viewHeight = this.height // Viewの縦幅 - val viewWidth = this.width // Viewの横幅 - - // テキストサイズ - var textSize = textSize - - // Paintにテキストサイズ設定 - val paint = Paint() - paint.textSize = textSize - - // テキスト取得 - if (modelText == null) { - modelText = text.toString() - } - - // テキストの縦幅取得 - var fm = paint.fontMetrics - var textHeight = Math.abs(fm.top) + Math.abs(fm.descent) - val lineNum = this.text!!.split("\n".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray().size - - // テキストの横幅取得 - var textWidth = paint.measureText(modelText) - - // 縦幅と、横幅が収まるまでループ - while ((viewHeight < (textHeight * lineNum)) or (viewWidth < textWidth)) { - // 調整しているテキストサイズが、定義している最小サイズ以下か。 - if (MIN_TEXT_SIZE >= textSize) { - // 最小サイズ以下になる場合は最小サイズ - textSize = MIN_TEXT_SIZE - break - } - - // テキストサイズをデクリメント - textSize-- - - // Paintにテキストサイズ設定 - paint.textSize = textSize - - // テキストの縦幅を再取得 - // 改行を考慮する - fm = paint.fontMetrics - textHeight = Math.abs(fm.top) + Math.abs(fm.descent) * numberLine - - // テキストの横幅を再取得 - textWidth = paint.measureText(modelText) - } - - // テキストサイズ設定 - setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) + AutoResizeUtils.resize(this, info) } - - /** - * 基準となる改行を含む文字列の最も文字列が大きい部分がViewの枠に収まるようにフォントサイズを調整する.(改行には適応してない模様) - * 文字列に改行を含まない場合、それをそのまま基準にする. - * 表示される文字列の最大数がわかっている時に有効利用できる. - * @param modelText - */ - protected fun setModelText(modelText: String?) { - if (modelText != null) { - val str = modelText.split("\n".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() - numberLine = str.size - var includeLinefeed = false - if (str.size > 1) includeLinefeed = true - - if (includeLinefeed) { - var a: String? = null // 一時変数 - var model: String? = null - for (i in str.indices) { - if (a == null) - a = str[i] - else { - // 2周目以降 - if (a.length >= str[i].length) - model = a - else - model = str[i] - } - } - this.modelText = model - } else { - this.modelText = modelText - } - } - } - - protected fun processAttributeSet(attrs: AttributeSet) { - //This method reads the parameters given in the xml file and sets the properties according to it - this.setModelText(attrs.getAttributeValue(null, "model_text")) - } } \ No newline at end of file diff --git a/app/src/main/java/com/chrhsmt/sisheng/ui/AutoResizeUtils.kt b/app/src/main/java/com/chrhsmt/sisheng/ui/AutoResizeUtils.kt new file mode 100644 index 0000000..2f5f2c2 --- /dev/null +++ b/app/src/main/java/com/chrhsmt/sisheng/ui/AutoResizeUtils.kt @@ -0,0 +1,112 @@ +package com.chrhsmt.sisheng.ui + +import android.content.Context +import android.graphics.Paint +import android.util.AttributeSet +import android.util.TypedValue +import android.widget.TextView + +/** + * フォントサイズ自動調整TextView + * + * ソースコードは以下から借用 + * http://aillicepray.blogspot.jp/2015/02/textview.html + */ +object AutoResizeUtils { + class AutoResizeInfo { + internal var modelText: String? = null + internal var numberLine = 1 + } + /** + * テキストサイズ調整 + */ + fun resize(view: TextView, info: AutoResizeInfo) { + /** 最小のテキストサイズ */ + val MIN_TEXT_SIZE = 10f + + val viewHeight = view.height // Viewの縦幅 + val viewWidth = view.width // Viewの横幅 + + // テキストサイズ + var textSize = view.textSize + + // Paintにテキストサイズ設定 + val paint = Paint() + paint.textSize = textSize + + // テキスト取得 + if (info.modelText == null) { + info.modelText = view.text.toString() + } + + // テキストの縦幅取得 + var fm = paint.fontMetrics + var textHeight = Math.abs(fm.top) + Math.abs(fm.descent) + val lineNum = view.text!!.split("\n".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray().size + + // テキストの横幅取得 + var textWidth = paint.measureText(info.modelText) + + // 縦幅と、横幅が収まるまでループ + while ((viewHeight < (textHeight * lineNum)) or (viewWidth < textWidth)) { + // 調整しているテキストサイズが、定義している最小サイズ以下か。 + if (MIN_TEXT_SIZE >= textSize) { + // 最小サイズ以下になる場合は最小サイズ + textSize = MIN_TEXT_SIZE + break + } + + // テキストサイズをデクリメント + textSize-- + + // Paintにテキストサイズ設定 + paint.textSize = textSize + + // テキストの縦幅を再取得 + // 改行を考慮する + fm = paint.fontMetrics + textHeight = Math.abs(fm.top) + Math.abs(fm.descent) * info.numberLine + + // テキストの横幅を再取得 + textWidth = paint.measureText(info.modelText) + } + + // テキストサイズ設定 + view.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) + } + + + /** + * 基準となる改行を含む文字列の最も文字列が大きい部分がViewの枠に収まるようにフォントサイズを調整する.(改行には適応してない模様) + * 文字列に改行を含まない場合、それをそのまま基準にする. + * 表示される文字列の最大数がわかっている時に有効利用できる. + * @param modelText + */ + fun setModelText(modelText: String?, info: AutoResizeInfo) { + if (modelText != null) { + val str = modelText.split("\n".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + info.numberLine = str.size + var includeLinefeed = false + if (str.size > 1) includeLinefeed = true + + if (includeLinefeed) { + var a: String? = null // 一時変数 + var model: String? = null + for (i in str.indices) { + if (a == null) + a = str[i] + else { + // 2周目以降 + if (a.length >= str[i].length) + model = a + else + model = str[i] + } + } + info.modelText = model + } else { + info.modelText = modelText + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_first_screen.xml b/app/src/main/res/layout/activity_first_screen.xml index 69d4a68..80e5982 100644 --- a/app/src/main/res/layout/activity_first_screen.xml +++ b/app/src/main/res/layout/activity_first_screen.xml @@ -47,7 +47,7 @@ tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteY="0dp" /> -