require"import"
import "android.animation.ValueAnimator"
local w=activity.width
SnackerBar={shouldDismiss=true}
import "android.view.animation.AccelerateDecelerateInterpolator"
local layout={
LinearLayout,
Gravity="bottom",
{
LinearLayout,
layout_height=-2,
layout_width=-1,
Gravity="center",
BackgroundColor=0xff333333,
{
TextView,
textColor=0xffffffff,
layout_weight=.8,
paddingLeft="10dp",
paddingTop="5dp",
paddingBottom="5dp",
layout_width=0,
},
{Button,
layout_height=-2,
style="?android:attr/buttonBarButtonStyle",
text="DONE",
}
}
}
local function addView(view)
local mLayoutParams=ViewGroup.LayoutParams
(-1,-1)
activity.Window.DecorView.addView(view,mLayoutParams)
end
local function removeView(view)
activity.Window.DecorView.removeView(view)
end
--设置提示文字
function SnackerBar:msg(textMsg)
self.textView.text=textMsg
return self
end
--设置按钮文字
function SnackerBar:actionText(textAction)
self.actionView.text=textAction
return self
end
--设置按钮动作
function SnackerBar:action(func)
self.actionView.onClick=
function()
func()
self:dismiss()
end
return self
end
--显示
function SnackerBar:show()
local view=self.view
addView(view)
view.translationY=300
view.animate().translationY(0)
.setInterpolator(AccelerateDecelerateInterpolator())
.setDuration(800).start()
indefiniteDismiss(self)
end
function indefiniteDismiss(snackerBar)
task(2000,function()
if snackerBar.shouldDismiss==true then
snackerBar:dismiss()
else
indefiniteDismiss(snackerBar)
end
end)
end
--关闭
function SnackerBar:dismiss()
local view=self.view
view.animate().translationY(300)
.setDuration(800)
.setListener(Animator.AnimatorListener{
onAnimationEnd=function()
removeView(view)
end
}).start()
end
SnackerBar.__index=SnackerBar
--构建者模式
function SnackerBar.build()
local mSnackerBar={}
setmetatable(mSnackerBar,SnackerBar)
mSnackerBar.view=loadlayout(layout)
mSnackerBar.bckView=mSnackerBar.view
.getChildAt(0)
mSnackerBar.textView=mSnackerBar.bckView
.getChildAt(0)
mSnackerBar.actionView=mSnackerBar.bckView
.getChildAt(1)
local function animate(v,tx,dura)
ValueAnimator().ofFloat({v.translationX,tx}).setDuration(dura)
.addUpdateListener( ValueAnimator.AnimatorUpdateListener
{
onAnimationUpdate=function( p1)
local f=p1.animatedValue
v.translationX=f
v.alpha=1-math.abs(v.translationX)/w
end
}).addListener(ValueAnimator.AnimatorListener{
onAnimationEnd=function()
if math.abs(tx)>=w then
removeView(mSnackerBar.view)
end
end
}).start()
end
local frx,p,v,fx=0,0,0,0
mSnackerBar.bckView.setOnTouchListener(View.OnTouchListener{
onTouch=function(view,event)
if event.Action==event.ACTION_DOWN then
mSnackerBar.shouldDismiss=false
frx=event.x
fx=event.x
elseif event.Action==event.ACTION_MOVE then
--高精度手指速度测量
if math.abs(event.rawX-frx)>=2 then
v=math.abs((frx-event.rawX)/(os.clock()-p)/1000)
end
p=os.clock()
frx=event.rawX
view.translationX=frx-fx
view.alpha=1-math.abs(view.translationX)/w
elseif event.Action==event.ACTION_UP then
mSnackerBar.shouldDismiss=true
local tx=view.translationX
if tx>=w/5 then
animate(view,w,(w-tx)/v)
elseif tx>0 and tx<w/5 then
animate(view,0,tx/v)
elseif tx<=-w/5 then
animate(view,-w,(w+tx)/v)
else
animate(view,0,-tx/v)
end
fx=0
end
return true
end
})
return mSnackerBar
end
来自解说社区客户端 |