カラムヘッダに切り欠きを追加
This commit is contained in:
parent
1cbf50bd32
commit
2bfd7d6011
|
@ -2553,7 +2553,7 @@ class ActMain : AppCompatActivity()
|
|||
phoneTab({ env ->
|
||||
val vh = env.pager_adapter.getColumnViewHolder(env.pager.currentItem)
|
||||
if(vh?.isColumnSettingShown == true) {
|
||||
vh.closeColumnSetting()
|
||||
vh.showColumnSetting(false)
|
||||
return@closeColumnSetting true
|
||||
}
|
||||
}, { env ->
|
||||
|
@ -2565,7 +2565,7 @@ class ActMain : AppCompatActivity()
|
|||
}
|
||||
|
||||
if(columnViewHolder?.isColumnSettingShown == true) {
|
||||
columnViewHolder.closeColumnSetting()
|
||||
columnViewHolder.showColumnSetting(false)
|
||||
return@closeColumnSetting true
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,8 @@ import android.content.Context
|
|||
import android.content.res.ColorStateList
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Color
|
||||
import android.graphics.Paint
|
||||
import android.graphics.Path
|
||||
import android.os.AsyncTask
|
||||
import android.os.SystemClock
|
||||
import android.text.InputType
|
||||
|
@ -36,11 +38,10 @@ import jp.juggler.subwaytooter.dialog.EmojiPicker
|
|||
import jp.juggler.subwaytooter.span.NetworkEmojiSpan
|
||||
import jp.juggler.subwaytooter.table.AcctColor
|
||||
import jp.juggler.subwaytooter.util.*
|
||||
import jp.juggler.subwaytooter.view.ListDivider
|
||||
import jp.juggler.subwaytooter.view.MyLinkMovementMethod
|
||||
import jp.juggler.subwaytooter.view.MyTextView
|
||||
import jp.juggler.subwaytooter.view.*
|
||||
import jp.juggler.util.*
|
||||
import org.jetbrains.anko.*
|
||||
import org.jetbrains.anko.custom.customView
|
||||
import java.io.Closeable
|
||||
import java.lang.reflect.Field
|
||||
import java.util.regex.Pattern
|
||||
|
@ -408,6 +409,7 @@ class ColumnViewHolder(
|
|||
btnAnnouncements.layoutParams.width = wh
|
||||
btnAnnouncements.layoutParams.height = wh
|
||||
btnAnnouncements.setPaddingRelative(pad, pad, pad, pad)
|
||||
|
||||
btnColumnSetting.layoutParams.width = wh
|
||||
btnColumnSetting.layoutParams.height = wh
|
||||
btnColumnSetting.setPaddingRelative(pad, pad, pad, pad)
|
||||
|
@ -599,7 +601,7 @@ class ColumnViewHolder(
|
|||
// 添付メディアや正規表現のフィルタ
|
||||
val bAllowFilter = column.canStatusFilter()
|
||||
|
||||
llColumnSetting.visibility = View.GONE
|
||||
showColumnSetting(false)
|
||||
|
||||
|
||||
|
||||
|
@ -881,8 +883,10 @@ class ColumnViewHolder(
|
|||
|
||||
}
|
||||
|
||||
fun closeColumnSetting() {
|
||||
llColumnSetting.visibility = View.GONE
|
||||
fun showColumnSetting(show:Boolean):Boolean{
|
||||
llColumnSetting.vg(show)
|
||||
llColumnHeader.invalidate()
|
||||
return show
|
||||
}
|
||||
|
||||
fun onListListUpdated() {
|
||||
|
@ -1066,7 +1070,7 @@ class ColumnViewHolder(
|
|||
llColumnHeader -> scrollToTop2()
|
||||
|
||||
btnColumnSetting -> {
|
||||
if(llColumnSetting.vg(llColumnSetting.visibility != View.VISIBLE) != null) {
|
||||
if(showColumnSetting(!isColumnSettingShown) ) {
|
||||
hideAnnouncements()
|
||||
}
|
||||
}
|
||||
|
@ -1639,8 +1643,11 @@ class ColumnViewHolder(
|
|||
layoutParams = lp
|
||||
}
|
||||
|
||||
llColumnHeader = verticalLayout {
|
||||
llColumnHeader = customView<CutoutLinearLayout> {
|
||||
lparams(matchParent, wrapContent)
|
||||
|
||||
orientation = LinearLayout.VERTICAL
|
||||
|
||||
background = ContextCompat.getDrawable(context, R.drawable.bg_column_header)
|
||||
startPadding = dip(12)
|
||||
endPadding = dip(12)
|
||||
|
@ -1684,7 +1691,6 @@ class ColumnViewHolder(
|
|||
linearLayout {
|
||||
lparams(matchParent, wrapContent) {
|
||||
topMargin = dip(0)
|
||||
|
||||
}
|
||||
gravity = Gravity.CENTER_VERTICAL
|
||||
isBaselineAligned = false
|
||||
|
@ -1709,6 +1715,8 @@ class ColumnViewHolder(
|
|||
gravity = Gravity.CENTER_VERTICAL
|
||||
startMargin = dip(2)
|
||||
}
|
||||
clipChildren = false
|
||||
|
||||
btnAnnouncements = imageButton {
|
||||
background =
|
||||
ContextCompat.getDrawable(context, R.drawable.btn_bg_transparent)
|
||||
|
@ -1716,6 +1724,29 @@ class ColumnViewHolder(
|
|||
setImageResource(R.drawable.ic_info_outline)
|
||||
padding = dip(8)
|
||||
scaleType = ImageView.ScaleType.FIT_CENTER
|
||||
|
||||
val paint = Paint().apply{
|
||||
isAntiAlias = true
|
||||
color = getAttributeColor(context, R.attr.colorSearchFormBackground)
|
||||
}
|
||||
val path = Path()
|
||||
addCutoutDrawer(this){canvas,parent,view,left,top->
|
||||
if( llAnnouncementsBox.visibility == View.VISIBLE){
|
||||
val viewW = view.width
|
||||
val viewH = view.height
|
||||
val triTopX = (left + viewW /2).toFloat()
|
||||
val triTopY = top.toFloat() + viewH * 0.75f
|
||||
val triBottomLeft = left.toFloat()
|
||||
val triBottomRight = (left+viewW).toFloat()
|
||||
val triBottom = parent.height.toFloat()
|
||||
path.reset()
|
||||
path.moveTo(triTopX,triTopY)
|
||||
path.lineTo(triBottomRight,triBottom)
|
||||
path.lineTo(triBottomLeft,triBottom)
|
||||
path.lineTo(triTopX,triTopY)
|
||||
canvas.drawPath(path, paint)
|
||||
}
|
||||
}
|
||||
}.lparams(dip(40), dip(40))
|
||||
|
||||
btnAnnouncementsBadge = imageView {
|
||||
|
@ -1726,8 +1757,16 @@ class ColumnViewHolder(
|
|||
endMargin = dip(4)
|
||||
topMargin = dip(4)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
frameLayout {
|
||||
lparams(wrapContent, wrapContent) {
|
||||
gravity = Gravity.CENTER_VERTICAL
|
||||
startMargin = dip(2)
|
||||
}
|
||||
clipChildren = false
|
||||
|
||||
btnColumnSetting = imageButton {
|
||||
background =
|
||||
ContextCompat.getDrawable(context, R.drawable.btn_bg_transparent)
|
||||
|
@ -1735,9 +1774,31 @@ class ColumnViewHolder(
|
|||
setImageResource(R.drawable.ic_tune)
|
||||
padding = dip(8)
|
||||
scaleType = ImageView.ScaleType.FIT_CENTER
|
||||
}.lparams(dip(40), dip(40)) {
|
||||
gravity = Gravity.CENTER_VERTICAL
|
||||
startMargin = dip(2)
|
||||
|
||||
val paint = Paint().apply{
|
||||
isAntiAlias = true
|
||||
color = getAttributeColor(context, R.attr.colorColumnSettingBackground)
|
||||
}
|
||||
val path = Path()
|
||||
addCutoutDrawer(this){canvas,parent,view,left,top->
|
||||
if( llColumnSetting.visibility == View.VISIBLE){
|
||||
val viewW = view.width
|
||||
val viewH = view.height
|
||||
val triTopX = (left + viewW /2).toFloat()
|
||||
val triTopY = top.toFloat() + viewH * 0.75f
|
||||
val triBottomLeft = left.toFloat()
|
||||
val triBottomRight = (left+viewW).toFloat()
|
||||
val triBottom = parent.height.toFloat()
|
||||
path.reset()
|
||||
path.moveTo(triTopX,triTopY)
|
||||
path.lineTo(triBottomRight,triBottom)
|
||||
path.lineTo(triBottomLeft,triBottom)
|
||||
path.lineTo(triTopX,triTopY)
|
||||
canvas.drawPath(path, paint)
|
||||
}
|
||||
}
|
||||
}.lparams(dip(40), dip(40))
|
||||
|
||||
}
|
||||
|
||||
btnColumnReload = imageButton {
|
||||
|
@ -1974,13 +2035,14 @@ class ColumnViewHolder(
|
|||
lparams(matchParent, wrapContent) {
|
||||
startMargin = dip(6)
|
||||
endMargin = dip(6)
|
||||
topMargin = dip(2)
|
||||
bottomMargin = dip(2)
|
||||
}
|
||||
|
||||
background = createRoundDrawable(
|
||||
dip(6).toFloat(),
|
||||
getAttributeColor(context, R.attr.colorSearchFormBackground)
|
||||
)
|
||||
|
||||
var pad_tb = dip(2)
|
||||
setPadding(0, pad_tb, 0, pad_tb)
|
||||
|
||||
|
@ -2324,7 +2386,7 @@ class ColumnViewHolder(
|
|||
if(column.announcementHideTime <= 0L)
|
||||
column.announcementHideTime = System.currentTimeMillis()
|
||||
} else {
|
||||
llColumnSetting.vg(false)
|
||||
showColumnSetting(false)
|
||||
column.announcementHideTime = 0L
|
||||
}
|
||||
activity.app_state.saveColumnList()
|
||||
|
@ -2353,6 +2415,7 @@ class ColumnViewHolder(
|
|||
btnAnnouncements.vg(false)
|
||||
llAnnouncementsBox.vg(false)
|
||||
btnAnnouncementsBadge.vg(false)
|
||||
llColumnHeader.invalidate()
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -2361,6 +2424,7 @@ class ColumnViewHolder(
|
|||
val expand = column.announcementHideTime <= 0L
|
||||
|
||||
llAnnouncementsBox.vg(expand)
|
||||
llColumnHeader.invalidate()
|
||||
|
||||
btnAnnouncementsBadge.vg(false)
|
||||
if(! expand) {
|
||||
|
|
|
@ -0,0 +1,105 @@
|
|||
package jp.juggler.subwaytooter.view
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.LinearLayout
|
||||
import jp.juggler.util.LogCategory
|
||||
import jp.juggler.util.cast
|
||||
import java.util.*
|
||||
|
||||
class CutoutLinearLayout : LinearLayout {
|
||||
companion object {
|
||||
private val log = LogCategory("CutoutLinearLayout")
|
||||
}
|
||||
|
||||
constructor(context : Context) :
|
||||
super(context) {
|
||||
init()
|
||||
}
|
||||
|
||||
constructor(context : Context, attrs : AttributeSet) :
|
||||
super(context, attrs) {
|
||||
init()
|
||||
}
|
||||
|
||||
constructor(context : Context, attrs : AttributeSet, defStyleAttr : Int) :
|
||||
super(context, attrs, defStyleAttr) {
|
||||
init()
|
||||
}
|
||||
|
||||
fun init() {
|
||||
setWillNotDraw(false)
|
||||
}
|
||||
|
||||
// override fun dispatchDraw(canvas : Canvas?) {
|
||||
// super.dispatchDraw(canvas)
|
||||
// }
|
||||
|
||||
class CutoutDrawer(
|
||||
val view : View,
|
||||
val draw : (
|
||||
canvas : Canvas,
|
||||
parent : ViewGroup,
|
||||
descendant : View,
|
||||
left : Int,
|
||||
top : Int
|
||||
) -> Unit
|
||||
)
|
||||
|
||||
private val cutoutList = LinkedList<CutoutDrawer>()
|
||||
|
||||
fun addCutoutDrawer(
|
||||
view : View,
|
||||
draw : (
|
||||
canvas : Canvas,
|
||||
parent : ViewGroup,
|
||||
descendant : View,
|
||||
left : Int,
|
||||
top : Int
|
||||
) -> Unit
|
||||
) {
|
||||
if(null == cutoutList.find { it.view == view && it.draw == draw }) cutoutList.add(
|
||||
CutoutDrawer(view, draw)
|
||||
)
|
||||
}
|
||||
|
||||
@Suppress("unused")
|
||||
fun removeCutoutDrawer(view : View) {
|
||||
val it = cutoutList.iterator()
|
||||
while(it.hasNext()) {
|
||||
val cb = it.next()
|
||||
if(cb.view == view) it.remove()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDraw(canvas : Canvas?) {
|
||||
super.onDraw(canvas)
|
||||
canvas ?: return
|
||||
log.d("CutoutLinearLayout.onDraw!")
|
||||
|
||||
val it = cutoutList.iterator()
|
||||
while(it.hasNext()) {
|
||||
val drawer = it.next()
|
||||
|
||||
var left = 0
|
||||
var top = 0
|
||||
var v = drawer.view
|
||||
while(true) {
|
||||
if(v == this) break
|
||||
val parent = v.parent.cast<ViewGroup>() ?: break
|
||||
left += v.left
|
||||
top += v.top
|
||||
v = parent
|
||||
}
|
||||
canvas.save()
|
||||
try {
|
||||
drawer.draw(canvas, this, drawer.view, left, top)
|
||||
} finally {
|
||||
canvas.restore()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue