Skip to content

Commit

Permalink
1.进一步重构相关方法
Browse files Browse the repository at this point in the history
2.修改了ImageLoaderOptions的实现方式
3.修复了之前设置defaultOptions和options的冲突
4.升级kotlin为1.3.21和jdk8
  • Loading branch information
keep2iron committed Jun 14, 2019
1 parent 1e27b24 commit 6c3a39e
Show file tree
Hide file tree
Showing 13 changed files with 239 additions and 143 deletions.
3 changes: 1 addition & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'

android {
compileSdkVersion versions.build.target_sdk
Expand Down Expand Up @@ -36,7 +35,7 @@ android {

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation deps.kotlin.stdlib_jdk7
implementation deps.kotlin.stdlib_jdk8
implementation deps.support.app_compat
implementation deps.support.constraint_layout
implementation deps.support.recyclerview
Expand Down
1 change: 1 addition & 0 deletions app/release/output.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package io.github.keep2iron.pineapple.app

import android.app.Activity
import android.app.Application
import android.content.ComponentCallbacks2
import android.content.res.Configuration
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.content.res.ResourcesCompat
import android.support.v7.widget.RecyclerView
import com.facebook.common.util.ByteConstants
import io.github.keep2iron.pineapple.ImageLoaderConfig
Expand All @@ -17,22 +14,22 @@ class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setCustomDensity(this, this.application)
ScreenDensityModule().setCustomDensity(this,application)
setContentView(R.layout.activity_main)

// Fresco.initialize(this.application)
ImageLoaderManager.init(
application,
ImageLoaderConfig(
applicationContext,
maxCacheCount = 300,
maxCacheSize = (400 * ByteConstants.MB).toLong()
),
defaultImageLoaderOptions = ImageLoaderOptions(
isCircleImage = true,
scaleType = ImageLoaderOptions.ScaleType.FIT_CENTER,
placeHolderRes = R.drawable.ic_launcher_background
)
defaultImageLoaderOptions = {
isCircleImage = true
scaleType = ImageLoaderOptions.ScaleType.FIT_CENTER
placeHolderRes = R.mipmap.ic_launcher
placeHolder = ResourcesCompat.getDrawable(resources, R.mipmap.ic_launcher, null)
}
)


Expand All @@ -43,41 +40,6 @@ class MainActivity : AppCompatActivity() {
)

val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.adapter = SampleListAdapter(this,data)
}

fun setCustomDensity(activity: Activity, application: Application) {
val applicationDisplayMetrics = application.resources.displayMetrics
if (ScreenDensityModule.sNonCompatDensity == 0f) {
ScreenDensityModule.sNonCompatDensity = applicationDisplayMetrics.density
ScreenDensityModule.sNonCompatScaleDensity = applicationDisplayMetrics.scaledDensity
application.registerComponentCallbacks(object : ComponentCallbacks2 {
override fun onTrimMemory(level: Int) {

}

override fun onConfigurationChanged(newConfig: Configuration?) {
if (newConfig != null && newConfig.fontScale > 0) {
ScreenDensityModule.sNonCompatScaleDensity = application.resources.displayMetrics.scaledDensity
}
}

override fun onLowMemory() {}
})
}

val targetDensity = applicationDisplayMetrics.widthPixels / 480f
val targetScaledDensity =
ScreenDensityModule.sNonCompatScaleDensity * (targetDensity / ScreenDensityModule.sNonCompatDensity)
val targetDpi = (targetDensity * 160).toInt()

applicationDisplayMetrics.density = targetDensity
applicationDisplayMetrics.densityDpi = targetDpi
applicationDisplayMetrics.scaledDensity = targetScaledDensity

val activityDisplayMetrics = activity.resources.displayMetrics
activityDisplayMetrics.density = targetDensity
activityDisplayMetrics.scaledDensity = targetScaledDensity
activityDisplayMetrics.densityDpi = targetDpi
recyclerView.adapter = SampleListAdapter(this, data)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import android.app.Activity
import android.app.Application
import android.content.ComponentCallbacks2
import android.content.res.Configuration
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentActivity
import android.support.v4.app.FragmentManager

class ScreenDensityModule {

Expand All @@ -14,6 +18,52 @@ class ScreenDensityModule {
var sNonCompatScaleDensity: Float = 0f
}


fun createComponentModule(application: Application) {
val fragmentLifeCycleListener = object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentCreated(fm: FragmentManager, fragment: Fragment, savedInstanceState: Bundle?) {
val activity = fragment.activity
if (activity != null) {
setCustomDensity(activity, activity.application)
}
}
}

application.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
setCustomDensity(activity, activity.application)
if (activity is FragmentActivity) {
activity.supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifeCycleListener, true)
}
}

override fun onActivityStarted(activity: Activity) {
}

override fun onActivityResumed(activity: Activity) {

}

override fun onActivityPaused(activity: Activity) {

}

override fun onActivityStopped(activity: Activity) {

}

override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {

}

override fun onActivityDestroyed(activity: Activity) {
if (activity is FragmentActivity) {
activity.supportFragmentManager.unregisterFragmentLifecycleCallbacks(fragmentLifeCycleListener)
}
}
})
}

fun setCustomDensity(activity: Activity, application: Application) {
val applicationDisplayMetrics = application.resources.displayMetrics
if (sNonCompatDensity == 0f) {
Expand All @@ -34,10 +84,14 @@ class ScreenDensityModule {
})
}

val targetDensity = applicationDisplayMetrics.widthPixels / 480f
val targetDensity = applicationDisplayMetrics.widthPixels / 375f
val targetScaledDensity = sNonCompatScaleDensity * (targetDensity / sNonCompatDensity)
val targetDpi = (targetDensity * 160).toInt()

val bitmapClazz = Class.forName("android.graphics.Bitmap")
val method = bitmapClazz.getMethod("setDefaultDensity", Int::class.java)
method.invoke(null, targetDpi)

applicationDisplayMetrics.density = targetDensity
applicationDisplayMetrics.densityDpi = targetDpi
applicationDisplayMetrics.scaledDensity = targetScaledDensity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,24 @@ class ShareElementActivity : AppCompatActivity() {
setContentView(R.layout.activity_share_element)
window.sharedElementEnterTransition = DraweeTransition.createTransitionSet(
ScalingUtils.ScaleType.CENTER_CROP,
ScalingUtils.ScaleType.CENTER_CROP) // 进入
ScalingUtils.ScaleType.FIT_CENTER
) // 进入
window.sharedElementReturnTransition = DraweeTransition.createTransitionSet(
ScalingUtils.ScaleType.CENTER_CROP,
ScalingUtils.ScaleType.CENTER_CROP) // 返回
ScalingUtils.ScaleType.FIT_CENTER,
ScalingUtils.ScaleType.CENTER_CROP
) // 返回

val imageView = findViewById<MiddlewareView>(R.id.imageView)
imageView.transitionName = "imageView"
val url = intent.getStringExtra("url")
ImageLoaderManager.getInstance().showImageView(
imageView, url, ImageLoaderOptions(
isCircleImage = false,
scaleType = ImageLoaderOptions.ScaleType.CENTER_CROP,
placeHolderRes = R.drawable.ic_launcher_background,
isLoadGif = true
)
)
imageView, url
) {
isCircleImage = false
scaleType = ImageLoaderOptions.ScaleType.FIT_CENTER
placeHolderRes = R.drawable.ic_launcher_background
isLoadGif = true
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,20 @@ class SampleListAdapter(val activity: AppCompatActivity, private val data: List<
override fun onBindViewHolder(holder: SampleListViewHolder, position: Int) {
// 通过 ImageLoadManager.INSTANCE 直接加载
ImageLoaderManager.getInstance().showImageView(
holder.binding.imageView, data[position], if (position == 0) ImageLoaderOptions(
isCircleImage = false,
scaleType = ImageLoaderOptions.ScaleType.FIT_XY,
placeHolderRes = R.drawable.ic_launcher_background,
holder.binding.imageView, data[position]
) {
if (position == 0) {
isCircleImage = false
scaleType = ImageLoaderOptions.ScaleType.FIT_XY
placeHolderRes = R.color.colorAccent
placeHolder = null
isLoadGif = true
) else ImageLoaderOptions(
} else {
scaleType = ImageLoaderOptions.ScaleType.CENTER_CROP
)
)
placeHolderRes = R.color.colorAccent
placeHolder = null
}
}

holder.itemView.transitionName = "imageView"
holder.itemView.setOnClickListener {
Expand Down
3 changes: 1 addition & 2 deletions lib-pineapple/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.github.dcendents.android-maven'

group='com.github.keep2iron' // 指定group,com.github.<用户名>
Expand Down Expand Up @@ -28,7 +27,7 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation deps.kotlin.stdlib_jdk7
implementation deps.kotlin.stdlib_jdk8
compileOnly deps.fresco
implementation deps.support.annotations
compileOnly deps.fresco_gif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,26 @@ class FrescoImageLoader : ImageLoader {

private var defaultImageLoaderOptions: ImageLoaderOptions? = null

override fun getDefaultImageOptions(): ImageLoaderOptions? = defaultImageLoaderOptions

override fun getConfig(): Any {
return config
}

private val handler = Handler(Looper.getMainLooper())

override fun init(context: Application, config: ImageLoaderConfig, defaultImageLoaderOptions: ImageLoaderOptions?) {
override fun init(
context: Application,
config: ImageLoaderConfig,
defaultImageLoaderOptions: ((ImageLoaderOptions.() -> Unit)?)?
) {
this.imageLoaderConfig = config
this.defaultImageLoaderOptions = defaultImageLoaderOptions

this.defaultImageLoaderOptions = if (defaultImageLoaderOptions != null) {
ImageLoaderOptions.newClearOption(defaultImageLoaderOptions)
} else {
null
}
val createMemoryCacheParams = {
val maxHeapSize = Runtime.getRuntime().maxMemory().toInt()
val maxMemoryCacheSize = maxHeapSize / 3 * 2//取手机内存最大值的三分之二作为可用的最大内存数
Expand Down Expand Up @@ -128,29 +139,31 @@ class FrescoImageLoader : ImageLoader {

this.config = imagePipelineConfigBuilder.build()
Fresco.initialize(context.applicationContext, this.config)
if (BuildConfig.DEBUG) {
if (config.debug) {
FLog.setMinimumLoggingLevel(FLog.VERBOSE)
}
}

override fun showImageView(imageView: MiddlewareView, resId: Int, options: ImageLoaderOptions) {
override fun showImageView(imageView: MiddlewareView, resId: Int, options: (ImageLoaderOptions.() -> Unit)?) {
this.showImageView(
imageView,
Uri.parse("res://" + imageView.context.applicationContext.packageName + "/" + resId),
options
)
}

override fun showImageView(imageView: MiddlewareView, uri: Uri, options: ImageLoaderOptions) {
val newOptions = if (defaultImageLoaderOptions != null) {
val newOptions = ImageLoaderOptions()
newOptions.setOptions(defaultImageLoaderOptions!!)
newOptions.setOptions(options)
newOptions
private fun getImageOptions(options: (ImageLoaderOptions.() -> Unit)?): ImageLoaderOptions {
return if (defaultImageLoaderOptions != null) {
ImageLoaderOptions.newOptionWithDefaultOptions(options)
} else {
options
ImageLoaderOptions.newClearOption(options)
}

}

override fun showImageView(imageView: MiddlewareView, uri: Uri, options: (ImageLoaderOptions.() -> Unit)?) {
val newOptions = getImageOptions(options)

val draweeView = imageView as SimpleDraweeView
val requestBuilder = buildImageRequest(uri, newOptions)
if (newOptions.iterations > 0 && newOptions.blurRadius > 0) {
Expand Down Expand Up @@ -211,7 +224,7 @@ class FrescoImageLoader : ImageLoader {
return controllerBuilder
}

override fun showImageView(imageView: MiddlewareView, url: String, options: ImageLoaderOptions) {
override fun showImageView(imageView: MiddlewareView, url: String, options: (ImageLoaderOptions.() -> Unit)?) {
showImageView(imageView, Uri.parse(url), options)
}

Expand All @@ -227,8 +240,14 @@ class FrescoImageLoader : ImageLoader {
return request
}

override fun getBitmap(context: Context, url: String, options: ImageLoaderOptions, onGetBitmap: (Bitmap?) -> Unit) {
val request = buildImageRequest(Uri.parse(url), options)
override fun getBitmap(
context: Context,
url: String,
onGetBitmap: (Bitmap?) -> Unit,
options: (ImageLoaderOptions.() -> Unit)?
) {
val opt = getImageOptions(options)
val request = buildImageRequest(Uri.parse(url), opt)
val imagePipeline = Fresco.getImagePipeline()
val dataSource = imagePipeline.fetchDecodedImage(request.build(), context.applicationContext)
dataSource.subscribe(object : BaseBitmapDataSubscriber() {
Expand Down
Loading

0 comments on commit 6c3a39e

Please sign in to comment.