Skip to content

Commit

Permalink
v0.22 解决内存泄漏的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
wanglu1209 committed Dec 4, 2018
1 parent cfcf6fd commit 4df637d
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 67 deletions.
161 changes: 103 additions & 58 deletions lib/src/main/java/com/wanglu/lib/BasePopup.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.wanglu.lib

import android.animation.Animator
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.app.Activity
import android.content.ContentValues.TAG
import android.content.Context
import android.graphics.Color
Expand All @@ -17,15 +19,11 @@ import android.widget.PopupWindow
open class BasePopup(val popParams: WPopParams) : View.OnTouchListener {

// 默认设置pop的宽高都为wrap_content
private val mPopup: PopupWindow
private val mPopup: PopupWindow = PopupWindow(popParams.width, popParams.height)
// 默认背景半透明数值为0.4f
private var dim = 0.4f
// 背景是否半透明
private var isBgDim = false
private var window: Window = popParams.activity.window
private var windowAttr: WindowManager.LayoutParams
private var bgDimAnimator: ValueAnimator
private var clearBgDimAnimator: ValueAnimator
// 背景透明动画时间
private var animDuration = 200L

Expand All @@ -36,74 +34,54 @@ open class BasePopup(val popParams: WPopParams) : View.OnTouchListener {
var defaultMargin: Int

init {
windowAttr = window.attributes
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
mPopup = PopupWindow(popParams.width, popParams.height)
mPopup.isFocusable = true

mPopup.contentView = popParams.activity.layoutInflater.inflate(popParams.layoutRes, null)
mPopup.contentView = LayoutInflater.from(popParams.activity).inflate(popParams.layoutRes, null)
dim = popParams.dimValue
isBgDim = popParams.isDim
mPopup.setOnDismissListener {
dismiss()
}

// 设置背景变暗的动画
bgDimAnimator = ValueAnimator.ofFloat(1f, dim)
bgDimAnimator.duration = animDuration
bgDimAnimator.addUpdateListener { animation ->
windowAttr.alpha = animation!!.animatedValue as Float
window.attributes = windowAttr
}


// 设置背景恢复的动画
clearBgDimAnimator = ValueAnimator.ofFloat(dim, 1f)
clearBgDimAnimator.duration = animDuration
clearBgDimAnimator.addUpdateListener { animation ->
windowAttr.alpha = animation!!.animatedValue as Float
window.attributes = windowAttr
mPopup.setOnDismissListener {
dismiss()
}



if (popParams.longClickView != null) {
// 判断是否是ListView或者GridView
if (popParams.longClickView!! is AbsListView) {
// 拦截点击事件获取坐标
(popParams.longClickView!! as AbsListView).setOnTouchListener { v, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
clickLocation[0] = event.rawX
clickLocation[1] = event.rawY
}
}
false
}
} else if (popParams.longClickView!! is RecyclerView) {
// 判断是不是RecyclerView 拦截点击事件获取坐标
(popParams.longClickView!! as RecyclerView).addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
override fun onTouchEvent(p0: RecyclerView, p1: MotionEvent) {

}

override fun onInterceptTouchEvent(p0: RecyclerView, event: MotionEvent): Boolean {
when {
popParams.longClickView!!.get() is AbsListView -> // 拦截点击事件获取坐标
(popParams.longClickView!!.get() as AbsListView).setOnTouchListener { v, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
clickLocation[0] = event.rawX
clickLocation[1] = event.rawY
}
}
return false
false
}
popParams.longClickView!!.get() is RecyclerView -> // 判断是不是RecyclerView 拦截点击事件获取坐标
(popParams.longClickView!!.get() as RecyclerView).addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
override fun onTouchEvent(p0: RecyclerView, p1: MotionEvent) {

override fun onRequestDisallowInterceptTouchEvent(p0: Boolean) {
}

}
override fun onInterceptTouchEvent(p0: RecyclerView, event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
clickLocation[0] = event.rawX
clickLocation[1] = event.rawY
}
}
return false
}

})
} else
popParams.longClickView!!.setOnTouchListener(this)
override fun onRequestDisallowInterceptTouchEvent(p0: Boolean) {

}

})
else -> popParams.longClickView!!.get()!!.setOnTouchListener(this)
}
}

mPopup.animationStyle = popParams.animRes
Expand Down Expand Up @@ -199,12 +177,9 @@ open class BasePopup(val popParams: WPopParams) : View.OnTouchListener {
return mPopup.contentView
}

fun getWindow(): Window {
return window
}

fun getContext(): Context {
return window.context
return popParams.activity
}

/**
Expand Down Expand Up @@ -480,7 +455,44 @@ open class BasePopup(val popParams: WPopParams) : View.OnTouchListener {
*/
private fun setBgDim() {
if (isBgDim) {
bgDimAnimator.start()
if (getContentView().context != null && getContentView().context is Activity) {
var window = (getContentView().context as Activity).window
var windowAttr = window.attributes
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)


// 设置背景变暗的动画
val bgDimAnimator = ValueAnimator.ofFloat(1f, dim)
bgDimAnimator!!.duration = animDuration
bgDimAnimator.addUpdateListener { animation ->
windowAttr.alpha = animation!!.animatedValue as Float
window.attributes = windowAttr
}



bgDimAnimator.addListener(object : Animator.AnimatorListener{
override fun onAnimationRepeat(animation: Animator?) {
}

override fun onAnimationEnd(animation: Animator?) {
window = null
windowAttr = null
}

override fun onAnimationCancel(animation: Animator?) {
}

override fun onAnimationStart(animation: Animator?) {
}

})


bgDimAnimator.start()


}
}
}

Expand All @@ -490,7 +502,40 @@ open class BasePopup(val popParams: WPopParams) : View.OnTouchListener {
*/
private fun resetDim() {
if (isBgDim) {
clearBgDimAnimator.start()

if (getContentView().context != null && getContentView().context is Activity) {
var window = (getContentView().context as Activity).window
var windowAttr = window.attributes
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)

// 设置背景恢复的动画
val clearBgDimAnimator = ValueAnimator.ofFloat(dim, 1f)
clearBgDimAnimator!!.duration = animDuration
clearBgDimAnimator.addUpdateListener { animation ->
windowAttr.alpha = animation!!.animatedValue as Float
window.attributes = windowAttr
}

clearBgDimAnimator.addListener(object : Animator.AnimatorListener{
override fun onAnimationRepeat(animation: Animator?) {
}

override fun onAnimationEnd(animation: Animator?) {
window = null
windowAttr = null
}

override fun onAnimationCancel(animation: Animator?) {
}

override fun onAnimationStart(animation: Animator?) {
}

})

clearBgDimAnimator.start()
}

}
}

Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/java/com/wanglu/lib/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ object Utils {
/**
* 获取窗口的大小
*/
fun getWindowSize(activity: Activity): IntArray {
fun getWindowSize(activity: Context): IntArray {
val result = IntArray(2)
val screenSize = getScreenSize(activity)
result[0] = screenSize[0]
Expand Down
7 changes: 4 additions & 3 deletions lib/src/main/java/com/wanglu/lib/WPopParams.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package com.wanglu.lib

import android.app.Activity
import android.content.Context
import android.graphics.Color
import android.support.v7.widget.LinearLayoutManager
import android.view.View
import android.view.ViewGroup
import java.lang.ref.WeakReference

data class WPopParams(
val layoutRes: Int, // 布局
val activity: Activity, // activity
val activity: Context, // activity
var isDim: Boolean = false, // 是否半透明
var dimValue: Float = 0.4f, // 半透明属性
var cancelable: Boolean = true, // 点击外部可以dismiss
Expand All @@ -28,6 +29,6 @@ data class WPopParams(
var commonIconDirection = WPopupDirection.LEFT // 传入的图片的位置
var commonDrawablePadding = 5
var commonIsEnableChangeAnim = true // 切换时是否启用动画
var longClickView: View? = null //长按点击事件的View
var longClickView: WeakReference<View>? = null //长按点击事件的View
var animRes = WPopupAnim.ANIM_ALPHA // 动画
}
11 changes: 6 additions & 5 deletions lib/src/main/java/com/wanglu/lib/WPopup.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.wanglu.lib

import android.app.Activity
import android.content.Context
import android.graphics.drawable.GradientDrawable
import android.graphics.drawable.LayerDrawable
import android.graphics.drawable.RotateDrawable
Expand All @@ -12,6 +12,7 @@ import android.widget.ImageView
import android.widget.LinearLayout
import com.wanglu.lib.rvDivider.HorizontalDividerItemDecoration
import com.wanglu.lib.rvDivider.VerticalDividerItemDecoration
import java.lang.ref.WeakReference


class WPopup(popParams: WPopParams) : BasePopup(popParams) {
Expand Down Expand Up @@ -57,9 +58,9 @@ class WPopup(popParams: WPopParams) : BasePopup(popParams) {

override fun showAtFingerLocation(direction: Int) {
if (direction == WPopupDirection.TOP || direction == WPopupDirection.RIGHT_TOP || direction == WPopupDirection.LEFT_TOP)
setTriangle(popParams.longClickView!!, WPopupDirection.TOP)
setTriangle(popParams.longClickView!!.get()!!, WPopupDirection.TOP)
else if (direction == WPopupDirection.LEFT_BOTTOM || direction == WPopupDirection.BOTTOM || direction == WPopupDirection.RIGHT_BOTTOM)
setTriangle(popParams.longClickView!!, WPopupDirection.BOTTOM)
setTriangle(popParams.longClickView!!.get()!!, WPopupDirection.BOTTOM)
super.showAtFingerLocation(direction)
}

Expand Down Expand Up @@ -153,7 +154,7 @@ class WPopup(popParams: WPopParams) : BasePopup(popParams) {
}


class Builder(activity: Activity) {
class Builder(activity: Context) {

companion object {
const val VERTICAL = "VERTICAL"
Expand Down Expand Up @@ -250,7 +251,7 @@ class WPopup(popParams: WPopParams) : BasePopup(popParams) {
* 获取长按事件的view
*/
fun setClickView(view: View): Builder {
popParams.longClickView = view
popParams.longClickView = WeakReference(view)
return this
}

Expand Down

0 comments on commit 4df637d

Please sign in to comment.