SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/view/MaxHeightScrollView.kt

46 lines
1.6 KiB
Kotlin

package jp.juggler.subwaytooter.view
import android.content.Context
import android.content.res.TypedArray
import android.util.AttributeSet
import android.widget.ScrollView
import jp.juggler.subwaytooter.R
import kotlin.math.min
class MaxHeightScrollView : ScrollView {
var maxHeight : Int = 0
constructor(context : Context) : super(context)
constructor(context : Context, attrs : AttributeSet) : super(context, attrs) {
val a = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView)
parseAttr(a)
a.recycle()
}
constructor(context : Context, attrs : AttributeSet, defStyleAttr : Int) : super(context, attrs, defStyleAttr) {
val a = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView, defStyleAttr, 0)
parseAttr(a)
a.recycle()
}
private fun parseAttr(a : TypedArray) {
maxHeight = a.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, 0)
}
override fun onMeasure(widthMeasureSpec : Int, heightMeasureSpec : Int) {
var heightMeasureSpec2 = heightMeasureSpec
if(maxHeight > 0) {
val hSize = MeasureSpec.getSize(heightMeasureSpec)
when(MeasureSpec.getMode(heightMeasureSpec)) {
MeasureSpec.AT_MOST -> heightMeasureSpec2 = MeasureSpec.makeMeasureSpec(min(hSize, maxHeight), MeasureSpec.AT_MOST)
MeasureSpec.UNSPECIFIED -> heightMeasureSpec2 = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST)
MeasureSpec.EXACTLY -> heightMeasureSpec2 = MeasureSpec.makeMeasureSpec(min(hSize, maxHeight), MeasureSpec.EXACTLY)
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec2)
}
}