46 lines
1.6 KiB
Kotlin
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)
|
|
}
|
|
|
|
}
|