カラムヘッダに切り欠きを追加
This commit is contained in:
parent
1cbf50bd32
commit
2bfd7d6011
|
@ -2553,7 +2553,7 @@ class ActMain : AppCompatActivity()
|
||||||
phoneTab({ env ->
|
phoneTab({ env ->
|
||||||
val vh = env.pager_adapter.getColumnViewHolder(env.pager.currentItem)
|
val vh = env.pager_adapter.getColumnViewHolder(env.pager.currentItem)
|
||||||
if(vh?.isColumnSettingShown == true) {
|
if(vh?.isColumnSettingShown == true) {
|
||||||
vh.closeColumnSetting()
|
vh.showColumnSetting(false)
|
||||||
return@closeColumnSetting true
|
return@closeColumnSetting true
|
||||||
}
|
}
|
||||||
}, { env ->
|
}, { env ->
|
||||||
|
@ -2565,7 +2565,7 @@ class ActMain : AppCompatActivity()
|
||||||
}
|
}
|
||||||
|
|
||||||
if(columnViewHolder?.isColumnSettingShown == true) {
|
if(columnViewHolder?.isColumnSettingShown == true) {
|
||||||
columnViewHolder.closeColumnSetting()
|
columnViewHolder.showColumnSetting(false)
|
||||||
return@closeColumnSetting true
|
return@closeColumnSetting true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,8 @@ import android.content.Context
|
||||||
import android.content.res.ColorStateList
|
import android.content.res.ColorStateList
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
|
import android.graphics.Paint
|
||||||
|
import android.graphics.Path
|
||||||
import android.os.AsyncTask
|
import android.os.AsyncTask
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
import android.text.InputType
|
import android.text.InputType
|
||||||
|
@ -36,11 +38,10 @@ import jp.juggler.subwaytooter.dialog.EmojiPicker
|
||||||
import jp.juggler.subwaytooter.span.NetworkEmojiSpan
|
import jp.juggler.subwaytooter.span.NetworkEmojiSpan
|
||||||
import jp.juggler.subwaytooter.table.AcctColor
|
import jp.juggler.subwaytooter.table.AcctColor
|
||||||
import jp.juggler.subwaytooter.util.*
|
import jp.juggler.subwaytooter.util.*
|
||||||
import jp.juggler.subwaytooter.view.ListDivider
|
import jp.juggler.subwaytooter.view.*
|
||||||
import jp.juggler.subwaytooter.view.MyLinkMovementMethod
|
|
||||||
import jp.juggler.subwaytooter.view.MyTextView
|
|
||||||
import jp.juggler.util.*
|
import jp.juggler.util.*
|
||||||
import org.jetbrains.anko.*
|
import org.jetbrains.anko.*
|
||||||
|
import org.jetbrains.anko.custom.customView
|
||||||
import java.io.Closeable
|
import java.io.Closeable
|
||||||
import java.lang.reflect.Field
|
import java.lang.reflect.Field
|
||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
|
@ -408,6 +409,7 @@ class ColumnViewHolder(
|
||||||
btnAnnouncements.layoutParams.width = wh
|
btnAnnouncements.layoutParams.width = wh
|
||||||
btnAnnouncements.layoutParams.height = wh
|
btnAnnouncements.layoutParams.height = wh
|
||||||
btnAnnouncements.setPaddingRelative(pad, pad, pad, pad)
|
btnAnnouncements.setPaddingRelative(pad, pad, pad, pad)
|
||||||
|
|
||||||
btnColumnSetting.layoutParams.width = wh
|
btnColumnSetting.layoutParams.width = wh
|
||||||
btnColumnSetting.layoutParams.height = wh
|
btnColumnSetting.layoutParams.height = wh
|
||||||
btnColumnSetting.setPaddingRelative(pad, pad, pad, pad)
|
btnColumnSetting.setPaddingRelative(pad, pad, pad, pad)
|
||||||
|
@ -599,7 +601,7 @@ class ColumnViewHolder(
|
||||||
// 添付メディアや正規表現のフィルタ
|
// 添付メディアや正規表現のフィルタ
|
||||||
val bAllowFilter = column.canStatusFilter()
|
val bAllowFilter = column.canStatusFilter()
|
||||||
|
|
||||||
llColumnSetting.visibility = View.GONE
|
showColumnSetting(false)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -881,8 +883,10 @@ class ColumnViewHolder(
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun closeColumnSetting() {
|
fun showColumnSetting(show:Boolean):Boolean{
|
||||||
llColumnSetting.visibility = View.GONE
|
llColumnSetting.vg(show)
|
||||||
|
llColumnHeader.invalidate()
|
||||||
|
return show
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onListListUpdated() {
|
fun onListListUpdated() {
|
||||||
|
@ -1066,7 +1070,7 @@ class ColumnViewHolder(
|
||||||
llColumnHeader -> scrollToTop2()
|
llColumnHeader -> scrollToTop2()
|
||||||
|
|
||||||
btnColumnSetting -> {
|
btnColumnSetting -> {
|
||||||
if(llColumnSetting.vg(llColumnSetting.visibility != View.VISIBLE) != null) {
|
if(showColumnSetting(!isColumnSettingShown) ) {
|
||||||
hideAnnouncements()
|
hideAnnouncements()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1639,8 +1643,11 @@ class ColumnViewHolder(
|
||||||
layoutParams = lp
|
layoutParams = lp
|
||||||
}
|
}
|
||||||
|
|
||||||
llColumnHeader = verticalLayout {
|
llColumnHeader = customView<CutoutLinearLayout> {
|
||||||
lparams(matchParent, wrapContent)
|
lparams(matchParent, wrapContent)
|
||||||
|
|
||||||
|
orientation = LinearLayout.VERTICAL
|
||||||
|
|
||||||
background = ContextCompat.getDrawable(context, R.drawable.bg_column_header)
|
background = ContextCompat.getDrawable(context, R.drawable.bg_column_header)
|
||||||
startPadding = dip(12)
|
startPadding = dip(12)
|
||||||
endPadding = dip(12)
|
endPadding = dip(12)
|
||||||
|
@ -1684,7 +1691,6 @@ class ColumnViewHolder(
|
||||||
linearLayout {
|
linearLayout {
|
||||||
lparams(matchParent, wrapContent) {
|
lparams(matchParent, wrapContent) {
|
||||||
topMargin = dip(0)
|
topMargin = dip(0)
|
||||||
|
|
||||||
}
|
}
|
||||||
gravity = Gravity.CENTER_VERTICAL
|
gravity = Gravity.CENTER_VERTICAL
|
||||||
isBaselineAligned = false
|
isBaselineAligned = false
|
||||||
|
@ -1709,6 +1715,8 @@ class ColumnViewHolder(
|
||||||
gravity = Gravity.CENTER_VERTICAL
|
gravity = Gravity.CENTER_VERTICAL
|
||||||
startMargin = dip(2)
|
startMargin = dip(2)
|
||||||
}
|
}
|
||||||
|
clipChildren = false
|
||||||
|
|
||||||
btnAnnouncements = imageButton {
|
btnAnnouncements = imageButton {
|
||||||
background =
|
background =
|
||||||
ContextCompat.getDrawable(context, R.drawable.btn_bg_transparent)
|
ContextCompat.getDrawable(context, R.drawable.btn_bg_transparent)
|
||||||
|
@ -1716,6 +1724,29 @@ class ColumnViewHolder(
|
||||||
setImageResource(R.drawable.ic_info_outline)
|
setImageResource(R.drawable.ic_info_outline)
|
||||||
padding = dip(8)
|
padding = dip(8)
|
||||||
scaleType = ImageView.ScaleType.FIT_CENTER
|
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))
|
}.lparams(dip(40), dip(40))
|
||||||
|
|
||||||
btnAnnouncementsBadge = imageView {
|
btnAnnouncementsBadge = imageView {
|
||||||
|
@ -1726,8 +1757,16 @@ class ColumnViewHolder(
|
||||||
endMargin = dip(4)
|
endMargin = dip(4)
|
||||||
topMargin = dip(4)
|
topMargin = dip(4)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
frameLayout {
|
||||||
|
lparams(wrapContent, wrapContent) {
|
||||||
|
gravity = Gravity.CENTER_VERTICAL
|
||||||
|
startMargin = dip(2)
|
||||||
|
}
|
||||||
|
clipChildren = false
|
||||||
|
|
||||||
btnColumnSetting = imageButton {
|
btnColumnSetting = imageButton {
|
||||||
background =
|
background =
|
||||||
ContextCompat.getDrawable(context, R.drawable.btn_bg_transparent)
|
ContextCompat.getDrawable(context, R.drawable.btn_bg_transparent)
|
||||||
|
@ -1735,9 +1774,31 @@ class ColumnViewHolder(
|
||||||
setImageResource(R.drawable.ic_tune)
|
setImageResource(R.drawable.ic_tune)
|
||||||
padding = dip(8)
|
padding = dip(8)
|
||||||
scaleType = ImageView.ScaleType.FIT_CENTER
|
scaleType = ImageView.ScaleType.FIT_CENTER
|
||||||
}.lparams(dip(40), dip(40)) {
|
|
||||||
gravity = Gravity.CENTER_VERTICAL
|
val paint = Paint().apply{
|
||||||
startMargin = dip(2)
|
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 {
|
btnColumnReload = imageButton {
|
||||||
|
@ -1974,13 +2035,14 @@ class ColumnViewHolder(
|
||||||
lparams(matchParent, wrapContent) {
|
lparams(matchParent, wrapContent) {
|
||||||
startMargin = dip(6)
|
startMargin = dip(6)
|
||||||
endMargin = dip(6)
|
endMargin = dip(6)
|
||||||
topMargin = dip(2)
|
|
||||||
bottomMargin = dip(2)
|
bottomMargin = dip(2)
|
||||||
}
|
}
|
||||||
|
|
||||||
background = createRoundDrawable(
|
background = createRoundDrawable(
|
||||||
dip(6).toFloat(),
|
dip(6).toFloat(),
|
||||||
getAttributeColor(context, R.attr.colorSearchFormBackground)
|
getAttributeColor(context, R.attr.colorSearchFormBackground)
|
||||||
)
|
)
|
||||||
|
|
||||||
var pad_tb = dip(2)
|
var pad_tb = dip(2)
|
||||||
setPadding(0, pad_tb, 0, pad_tb)
|
setPadding(0, pad_tb, 0, pad_tb)
|
||||||
|
|
||||||
|
@ -2324,7 +2386,7 @@ class ColumnViewHolder(
|
||||||
if(column.announcementHideTime <= 0L)
|
if(column.announcementHideTime <= 0L)
|
||||||
column.announcementHideTime = System.currentTimeMillis()
|
column.announcementHideTime = System.currentTimeMillis()
|
||||||
} else {
|
} else {
|
||||||
llColumnSetting.vg(false)
|
showColumnSetting(false)
|
||||||
column.announcementHideTime = 0L
|
column.announcementHideTime = 0L
|
||||||
}
|
}
|
||||||
activity.app_state.saveColumnList()
|
activity.app_state.saveColumnList()
|
||||||
|
@ -2353,6 +2415,7 @@ class ColumnViewHolder(
|
||||||
btnAnnouncements.vg(false)
|
btnAnnouncements.vg(false)
|
||||||
llAnnouncementsBox.vg(false)
|
llAnnouncementsBox.vg(false)
|
||||||
btnAnnouncementsBadge.vg(false)
|
btnAnnouncementsBadge.vg(false)
|
||||||
|
llColumnHeader.invalidate()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2361,6 +2424,7 @@ class ColumnViewHolder(
|
||||||
val expand = column.announcementHideTime <= 0L
|
val expand = column.announcementHideTime <= 0L
|
||||||
|
|
||||||
llAnnouncementsBox.vg(expand)
|
llAnnouncementsBox.vg(expand)
|
||||||
|
llColumnHeader.invalidate()
|
||||||
|
|
||||||
btnAnnouncementsBadge.vg(false)
|
btnAnnouncementsBadge.vg(false)
|
||||||
if(! expand) {
|
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