diff --git a/.idea/dictionaries/rumia.xml b/.idea/dictionaries/rumia.xml
new file mode 100644
index 0000000..ddce754
--- /dev/null
+++ b/.idea/dictionaries/rumia.xml
@@ -0,0 +1,9 @@
+
+
+
+ cdwn
+ manga
+ rmrf
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 1fe9e83..3ffefd1 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,8 +11,8 @@ android {
applicationId "top.fumiama.copymanga"
minSdkVersion 23
targetSdkVersion 30
- versionCode 9
- versionName '1.3.1'
+ versionCode 10
+ versionName '1.3.2'
resConfigs "zh", "zh-rCN"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/app/src/main/java/top/fumiama/copymanga/activity/DlActivity.kt b/app/src/main/java/top/fumiama/copymanga/activity/DlActivity.kt
index ce60788..6e6302c 100644
--- a/app/src/main/java/top/fumiama/copymanga/activity/DlActivity.kt
+++ b/app/src/main/java/top/fumiama/copymanga/activity/DlActivity.kt
@@ -25,6 +25,7 @@ import top.fumiama.copymanga.handler.DlHandler
import top.fumiama.copymanga.tool.MangaDlTools
import top.fumiama.copymanga.tool.MangaDlTools.Companion.wmdlt
import top.fumiama.copymanga.tool.ToolsBox
+import top.fumiama.copymanga.view.ChapterToggleButton
import top.fumiama.copymanga.view.LazyScrollView
import java.io.File
import java.lang.Thread.sleep
@@ -41,17 +42,14 @@ class DlActivity : Activity() {
var haveDlStarted = false
private var btnNumPerRow = 4
private lateinit var ltbtn: View
- var tbtnlist: List = arrayListOf()
- var tbtnUrlList = arrayListOf()
+ var tbtnlist: Array = arrayOf()
private val handler = DlHandler(this, Looper.myLooper()!!)
private var btnw = 0
private var cdwnWidth = 0
private var canDl = false
private lateinit var toolsBox: ToolsBox
- lateinit var mangaDlTools: MangaDlTools
+ private lateinit var mangaDlTools: MangaDlTools
var multiSelect = false
- private var zipArrayList: Array = arrayOf()
-
@ExperimentalStdlibApi
@SuppressLint("SetTextI18n")
@@ -85,14 +83,14 @@ class DlActivity : Activity() {
private fun fillChapters() {
mangaDlTools.allocateChapterUrls(checkedChapter)
- for (i in tbtnlist.indices) {
- if (tbtnlist[i].isChecked) mangaDlTools.dlChapterUrl(tbtnUrlList[i])
+ for (i in tbtnlist) {
+ if (i.isChecked) mangaDlTools.dlChapterUrl(i.url.toString())
}
}
- private fun dlThead(dlMethod: (i: ToggleButton) -> Unit) {
+ private fun dlThread(dlMethod: (i: ChapterToggleButton) -> Unit) {
sleep(10000)
- for (i in tbtnlist.listIterator()) {
+ for (i in tbtnlist) {
if (i.isChecked) dlMethod(i)
if (!canDl) {
checkedChapter -= dldChapter
@@ -139,7 +137,7 @@ class DlActivity : Activity() {
handler.sendEmptyMessage(9) //set dl card color to red
Toast.makeText(this, "十秒后开始下载...", Toast.LENGTH_SHORT).show()
fillChapters()
- Thread { dlThead { downloadChapterPages(it) } }.start()
+ Thread { dlThread { downloadChapterPages(it) } }.start()
}
}
}
@@ -157,6 +155,7 @@ class DlActivity : Activity() {
}
private fun analyzeStructure() {
+ ViewMangaActivity.zipList = arrayOf()
Gson().fromJson(json?.reader(), Array::class.java)?.let {
for (group in it) {
val tc = layoutInflater.inflate(R.layout.line_caption, ldwn, false)
@@ -182,21 +181,21 @@ class DlActivity : Activity() {
val mangaHome = File("${getExternalFilesDir("")}/$comicName")
val jsonFile = File(mangaHome, "info.bin")
if(!mangaHome.exists()) mangaHome.mkdirs()
- json?.let { jsonFile.writeText(it) }
+ if(!(jsonFile.exists() && intent.getBooleanExtra("callFromDlList", false))) json?.let { jsonFile.writeText(it) }
}
@ExperimentalStdlibApi
- private fun downloadChapterPages(i: ToggleButton) {
+ private fun downloadChapterPages(i: ChapterToggleButton) {
mangaDlTools.onDownloadedListener =
object : MangaDlTools.OnDownloadedListener {
override fun handleMessage(succeed: Boolean) {
- handler.obtainMessage(if (succeed) 1 else -1, tbtnlist.indexOf(i), 0)
+ handler.obtainMessage(if (succeed) 1 else -1, i.index, 0)
.sendToTarget()
}
override fun handleMessage(succeed: Boolean, pageNow: Int) {
handler.obtainMessage(
5,
- tbtnlist.indexOf(i),
+ i.index,
pageNow,
succeed
).sendToTarget()
@@ -204,15 +203,17 @@ class DlActivity : Activity() {
override fun handleMessage(pageNow: Int){
handler.obtainMessage(
10,
- tbtnlist.indexOf(i),
+ i.index,
pageNow
).sendToTarget()
}
}
- mangaDlTools.dlChapterAndPackIntoZip(
- File("${getExternalFilesDir("")}/$comicName/${i.hint}/${i.textOn}.zip"),
- tbtnUrlList[tbtnlist.indexOf(i)].substringAfterLast("/")
- )
+ i.hash?.let {
+ mangaDlTools.dlChapterAndPackIntoZip(
+ File("${getExternalFilesDir("")}/$comicName/${i.hint}/${i.textOn}.zip"),
+ it
+ )
+ }
}
@SuppressLint("SetTextI18n")
@@ -224,11 +225,12 @@ class DlActivity : Activity() {
isNewTitle = false
}
val tbv = layoutInflater.inflate(R.layout.button_tbutton, ltbtn.ltbtn, false)
+ tbv.tbtn.index = tbtnlist.size
tbtnlist += tbv.tbtn
+ tbv.tbtn.url = url
tbtncnt++
- tbtnUrlList.add(url)
- val zipPosition = zipArrayList.size
- zipArrayList += "$title.zip"
+ val zipPosition = ViewMangaActivity.zipList?.size
+ ViewMangaActivity.zipList = ViewMangaActivity.zipList?.plus("$title.zip")
tbv.tbtn.textOff = title
tbv.tbtn.textOn = title
tbv.tbtn.text = title
@@ -251,7 +253,7 @@ class DlActivity : Activity() {
else tdwn.text = "$dldChapter/${--checkedChapter}"
}else if(it.tbtn.isChecked){
it.tbtn.isChecked = false
- callVM(title, zipf, zipPosition)
+ zipPosition?.let { callVM(title, zipf, it) }
}
}
tbv.tbtn.setOnLongClickListener {
@@ -289,7 +291,7 @@ class DlActivity : Activity() {
private fun callVM(titleText: String, zipFile: File, zipPosition:Int){
ViewMangaActivity.titleText = titleText
ViewMangaActivity.zipFile = zipFile
- ViewMangaActivity.zipList = zipArrayList
+ //ViewMangaActivity.zipList = zipArrayList
ViewMangaActivity.zipPosition = zipPosition
ViewMangaActivity.cd = zipFile.parentFile
startActivity(Intent(this, ViewMangaActivity::class.java))
diff --git a/app/src/main/java/top/fumiama/copymanga/activity/DlListActivity.kt b/app/src/main/java/top/fumiama/copymanga/activity/DlListActivity.kt
index e1c6196..99072d0 100644
--- a/app/src/main/java/top/fumiama/copymanga/activity/DlListActivity.kt
+++ b/app/src/main/java/top/fumiama/copymanga/activity/DlListActivity.kt
@@ -57,7 +57,7 @@ class DlListActivity:Activity() {
ViewMangaActivity.zipFile = chosenFile
ViewMangaActivity.titleText = it[position]
ViewMangaActivity.zipPosition = position
- ViewMangaActivity.zipList = it
+ ViewMangaActivity.zipList = it as Array
ViewMangaActivity.cd = cd
startActivity(Intent(this, ViewMangaActivity::class.java))
}
@@ -66,8 +66,8 @@ class DlListActivity:Activity() {
mylv.setOnItemLongClickListener { _, _, position, _ ->
val chosenFile = File(cd, it[position])
AlertDialog.Builder(this)
- .setIcon(R.drawable.ic_launcher_foreground).setMessage("是否在此执行删除/查错?")
- .setTitle("提示").setPositiveButton(android.R.string.ok){ _, _ ->
+ .setIcon(R.drawable.ic_launcher_foreground).setMessage("在此执行删除/查错?")
+ .setTitle("提示").setPositiveButton("删除"){ _, _ ->
if(chosenFile.exists()) handler?.obtainMessage(2, chosenFile)?.sendToTarget() //call rmrf
handler?.obtainMessage(3, cd)?.sendToTarget() //call scanFile
}.setNegativeButton(android.R.string.cancel){_, _ ->}
@@ -97,7 +97,10 @@ class DlListActivity:Activity() {
private fun callDownloadActivity(jsonFile: File){
DlActivity.json = jsonFile.readText()
DlActivity.comicName = jsonFile.parentFile?.name?:"Null"
- startActivity(Intent(this, DlActivity::class.java))
+ startActivity(
+ Intent(this, DlActivity::class.java)
+ .putExtra("callFromDlList", true)
+ )
}
private fun findNullWebpZipFileInDir(f: File){
diff --git a/app/src/main/java/top/fumiama/copymanga/activity/MainActivity.kt b/app/src/main/java/top/fumiama/copymanga/activity/MainActivity.kt
index 7b13aaf..a8a7096 100644
--- a/app/src/main/java/top/fumiama/copymanga/activity/MainActivity.kt
+++ b/app/src/main/java/top/fumiama/copymanga/activity/MainActivity.kt
@@ -26,7 +26,7 @@ class MainActivity: Activity() {
setContentView(R.layout.activity_main)
wm = WeakReference(this)
- mh = MainHandler(Looper.getMainLooper())
+ mh = MainHandler(Looper.myLooper()!!)
toolsBox = ToolsBox(wm as WeakReference)
toolsBox?.netinfo?.let {
if(it == "无网络" || it == "错误"){
diff --git a/app/src/main/java/top/fumiama/copymanga/activity/ViewMangaActivity.kt b/app/src/main/java/top/fumiama/copymanga/activity/ViewMangaActivity.kt
index 34a0540..07b6e16 100644
--- a/app/src/main/java/top/fumiama/copymanga/activity/ViewMangaActivity.kt
+++ b/app/src/main/java/top/fumiama/copymanga/activity/ViewMangaActivity.kt
@@ -5,10 +5,7 @@ import android.annotation.SuppressLint
import android.app.Activity
import android.graphics.Bitmap
import android.graphics.BitmapFactory
-import android.os.Build
-import android.os.Bundle
-import android.os.Handler
-import android.os.Message
+import android.os.*
import android.util.Log
import android.view.LayoutInflater
import android.view.View
@@ -105,6 +102,13 @@ class ViewMangaActivity : Activity() {
}
try {
prepareItems()
+ if(pn > 0) {
+ pageNum = pn
+ pn = -1
+ }else if(pn == -2){
+ pageNum = count
+ pn = -1
+ }
} catch (e: Exception) {
e.printStackTrace()
toolsBox.toastError("准备控件错误")
@@ -152,7 +156,11 @@ class ViewMangaActivity : Activity() {
private fun loadOneImg() {
if(dlZip2View) onei.setImageBitmap(getImgBitmap(currentItem))
- else Glide.with(this@ViewMangaActivity).load(imgUrls[currentItem]).placeholder(R.drawable.bg_comment).into(onei)
+ else Glide.with(this@ViewMangaActivity)
+ .load(imgUrls[currentItem])
+ .placeholder(R.drawable.ic_dl)
+ .dontAnimate()
+ .into(onei)
updateSeekBar()
}
@@ -338,7 +346,7 @@ class ViewMangaActivity : Activity() {
//Glide.with(this@ViewMangaActivity).load(it).placeholder(R.drawable.bg_comment).into(holder.itemView.onei)
holder.itemView.onei.setImageBitmap(it)
}
- else Glide.with(this@ViewMangaActivity).load(imgUrls[pos]).placeholder(R.drawable.bg_comment).timeout(10000).into(holder.itemView.onei)
+ else Glide.with(this@ViewMangaActivity).load(imgUrls[pos]).placeholder(R.drawable.ic_dl).dontAnimate().timeout(10000).into(holder.itemView.onei)
}
override fun getItemCount(): Int {
@@ -377,7 +385,7 @@ class ViewMangaActivity : Activity() {
class MyHandler(
private val infcard: View,
private val toolsBox: ToolsBox
- ) : Handler() {
+ ) : Handler(Looper.myLooper()!!) {
private var infcShowed = false
private var delta = -1f
get() {
@@ -429,7 +437,8 @@ class ViewMangaActivity : Activity() {
var nextChapterUrl: String? = null
var previousChapterUrl: String? = null
var zipPosition = 0
- var zipList: Array? = null
+ var zipList: Array? = null
var cd: File? = null
+ var pn = -1
}
}
\ No newline at end of file
diff --git a/app/src/main/java/top/fumiama/copymanga/handler/DlHandler.kt b/app/src/main/java/top/fumiama/copymanga/handler/DlHandler.kt
index 5cf2490..635a755 100644
--- a/app/src/main/java/top/fumiama/copymanga/handler/DlHandler.kt
+++ b/app/src/main/java/top/fumiama/copymanga/handler/DlHandler.kt
@@ -48,7 +48,7 @@ class DlHandler(activity: DlActivity, looper: Looper) : Handler(looper) {
d?.pdwn?.progress = 0
val selectDownloaded = d?.multiSelect?:false
if (d?.haveSElectAll == true) {
- d?.tbtnlist?.listIterator()?.forEach { i ->
+ d?.tbtnlist?.forEach { i ->
if(i.freezesText) i.setBackgroundResource(R.drawable.rndbg_checked) else i.setBackgroundResource(R.drawable.toggle_button)
i.isChecked = false
}
@@ -62,7 +62,7 @@ class DlHandler(activity: DlActivity, looper: Looper) : Handler(looper) {
i.isChecked = true
it.checkedChapter++
}
- for (i in it.tbtnlist.listIterator()) {
+ for (i in it.tbtnlist) {
if(selectDownloaded) checkBtn(i, it)
else if(!i.freezesText) checkBtn(i, it)
}
@@ -90,7 +90,7 @@ class DlHandler(activity: DlActivity, looper: Looper) : Handler(looper) {
}
private fun setSize(pageNow: Int, tbtnNo: Int){
if(refreshSize || size == 0) {
- size = d?.tbtnUrlList?.get(tbtnNo)?.let { wmdlt?.get()?.getImgsCountByHash(it.substringAfterLast("/")) }?:0
+ size = d?.tbtnlist?.get(tbtnNo)?.hash?.let { wmdlt?.get()?.getImgsCountByHash(it) }?:0
refreshSize = false
}else if(pageNow == size) refreshSize = true
}
diff --git a/app/src/main/java/top/fumiama/copymanga/handler/MainHandler.kt b/app/src/main/java/top/fumiama/copymanga/handler/MainHandler.kt
index 78d4594..e7f4ab9 100644
--- a/app/src/main/java/top/fumiama/copymanga/handler/MainHandler.kt
+++ b/app/src/main/java/top/fumiama/copymanga/handler/MainHandler.kt
@@ -28,9 +28,9 @@ class MainHandler(looper: Looper):Handler(looper) {
}
private fun loadUrlInHiddenWebView(url: String){wm?.get()?.wh?.loadUrl(url)}
private fun callViewManga(content: String){
- val listChapter = content.split("\n")
+ val listChapter = content.split('\n')
if(!saveUrlsOnly) {
- ViewMangaActivity.titleText = listChapter[0].substringBeforeLast(" ")
+ ViewMangaActivity.titleText = listChapter[0].substringBeforeLast(' ')
ViewMangaActivity.nextChapterUrl = listChapter[1].let { if(it == "null") null else it }
ViewMangaActivity.previousChapterUrl = listChapter[2].let { if(it == "null") null else it }
ViewMangaActivity.imgUrls = arrayOf()
@@ -39,7 +39,7 @@ class MainHandler(looper: Looper):Handler(looper) {
} else{
var imgs = arrayOf()
for(i in 3 until listChapter.size) imgs += listChapter[i]
- wmdlt?.get()?.setChapterImgs(listChapter[0].substringAfterLast(" "), imgs)
+ wmdlt?.get()?.setChapterImgs(listChapter[0].substringAfterLast(' '), imgs)
}
}
private fun updateLoadProgress(progress: Int){
diff --git a/app/src/main/java/top/fumiama/copymanga/tool/PagesManager.kt b/app/src/main/java/top/fumiama/copymanga/tool/PagesManager.kt
index f9c2265..0c24196 100644
--- a/app/src/main/java/top/fumiama/copymanga/tool/PagesManager.kt
+++ b/app/src/main/java/top/fumiama/copymanga/tool/PagesManager.kt
@@ -1,7 +1,6 @@
package top.fumiama.copymanga.tool
import android.content.Intent
-import android.util.Log
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
import top.fumiama.copymanga.activity.MainActivity.Companion.wm
@@ -21,9 +20,6 @@ class PagesManager(w: WeakReference) {
private fun judgeNext() = v?.pageNum?:0 < v?.count?:0
@ExperimentalStdlibApi
private fun toPage(goNext:Boolean){
- val chapterUrl = if(goNext) ViewMangaActivity.nextChapterUrl else ViewMangaActivity.previousChapterUrl
- val newZipPosition = ViewMangaActivity.zipPosition + (if(goNext) 1 else -1)
- val hint = if(goNext) "下" else "上"
if (v?.clicked == false) {
if (if(goNext)judgeNext() else judgePrevious()) {
if(goNext) {
@@ -33,33 +29,42 @@ class PagesManager(w: WeakReference) {
v.scrollBack()
isEndL = false
}
- } else if (chapterUrl != null) {
- if (if(goNext)isEndR else isEndL) {
- wm?.get()?.w?.loadUrl("javascript:invoke.clickClass(\"comicControlBottomTopClick\",${if(goNext)1 else 0});")
- v.tt.canDo = false
- v.finish()
- } else doubleTapToast(hint, goNext)
- } else if(v.dlZip2View && newZipPosition >= 0 && newZipPosition < ViewMangaActivity.zipList?.size?:0){
- if (if(goNext)isEndR else isEndL){
- ViewMangaActivity.zipPosition = newZipPosition
- ViewMangaActivity.titleText = ViewMangaActivity.zipList?.get(newZipPosition) ?: "null"
- ViewMangaActivity.zipFile = File(ViewMangaActivity.cd, ViewMangaActivity.titleText)
- v.startActivity(Intent(v, ViewMangaActivity::class.java))
- v.tt.canDo = false
- v.finish()
- }else doubleTapToast(hint, goNext)
+ } else {
+ val chapterUrl = if(goNext) ViewMangaActivity.nextChapterUrl else ViewMangaActivity.previousChapterUrl
+ if (chapterUrl != null) {
+ if (if(goNext)isEndR else isEndL) {
+ if(!goNext) ViewMangaActivity.pn = -2
+ wm?.get()?.w?.loadUrl("javascript:invoke.clickClass(\"comicControlBottomTopClick\",${if(goNext)1 else 0});")
+ v.tt.canDo = false
+ v.finish()
+ } else doubleTapToast(goNext)
+ } else {
+ val newZipPosition = ViewMangaActivity.zipPosition + (if(goNext) 1 else -1)
+ if(v.dlZip2View && newZipPosition >= 0 && newZipPosition < ViewMangaActivity.zipList?.size?:0){
+ if (if(goNext)isEndR else isEndL){
+ if(!goNext) ViewMangaActivity.pn = -2
+ ViewMangaActivity.zipPosition = newZipPosition
+ ViewMangaActivity.titleText = ViewMangaActivity.zipList?.get(newZipPosition) ?: "null"
+ ViewMangaActivity.zipFile = File(ViewMangaActivity.cd, ViewMangaActivity.titleText)
+ v.startActivity(Intent(v, ViewMangaActivity::class.java))
+ v.tt.canDo = false
+ v.finish()
+ }else doubleTapToast(goNext)
+ }
+ else Toast.makeText(
+ v.applicationContext,
+ "已经到头了~",
+ Toast.LENGTH_SHORT
+ ).show()
+ }
}
- else Toast.makeText(
- v.applicationContext,
- "已经到头了~",
- Toast.LENGTH_SHORT
- ).show()
} else v?.hideObjs()
}
fun manageInfo(){
if (v?.clicked == false) v.showObjs() else v?.hideObjs()
}
- private fun doubleTapToast(hint: String, goNext: Boolean){
+ private fun doubleTapToast(goNext: Boolean){
+ val hint = if(goNext) "下" else "上"
Toast.makeText(
v?.applicationContext,
"再次按下加载${hint}一章",
diff --git a/app/src/main/java/top/fumiama/copymanga/view/ChapterToggleButton.kt b/app/src/main/java/top/fumiama/copymanga/view/ChapterToggleButton.kt
new file mode 100644
index 0000000..8e221e3
--- /dev/null
+++ b/app/src/main/java/top/fumiama/copymanga/view/ChapterToggleButton.kt
@@ -0,0 +1,23 @@
+package top.fumiama.copymanga.view
+
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.ToggleButton
+
+class ChapterToggleButton: ToggleButton {
+ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr)
+ constructor(context: Context?, attrs: AttributeSet?): super(context, attrs)
+ constructor(context: Context?): super(context, null)
+
+ var url: CharSequence? = null
+ val hash get() = url?.toString()?.substringAfterLast('/')
+ var caption: CharSequence? = null
+ var index: Int = 0
+ var chapterName: CharSequence = "null"
+ set(value) {
+ textOn = value
+ textOff = value
+ text = value
+ field = value
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/top/fumiama/copymanga/view/ScaleImageView.kt b/app/src/main/java/top/fumiama/copymanga/view/ScaleImageView.kt
index 0ce0fc4..56d1e62 100644
--- a/app/src/main/java/top/fumiama/copymanga/view/ScaleImageView.kt
+++ b/app/src/main/java/top/fumiama/copymanga/view/ScaleImageView.kt
@@ -94,17 +94,17 @@ class ScaleImageView : ImageView {
* 外部变换矩阵记录了图片手势操作的最终结果,是相对于图片fit center状态的变换.
* 默认值为单位矩阵,此时图片为fit center状态.
*
- @param matrix 用于填充结果的对象
- @return 如果传了matrix参数则将matrix填充后返回,否则new一个填充返回
+ @param matrix 用于填充结果的对象
+ @return 如果传了matrix参数则将matrix填充后返回,否则new一个填充返回
fun getOuterMatrix(matrix: Matrix?): Matrix {
- var matrix = matrix
- if (matrix == null) {
- matrix = Matrix(mOuterMatrix)
- } else {
- matrix.set(mOuterMatrix)
- }
- return matrix
+ var matrix = matrix
+ if (matrix == null) {
+ matrix = Matrix(mOuterMatrix)
+ } else {
+ matrix.set(mOuterMatrix)
+ }
+ return matrix
}*/
/**
@@ -117,34 +117,44 @@ class ScaleImageView : ImageView {
* @return 如果传了matrix参数则将matrix填充后返回,否则new一个填充返回
*/
private fun getInnerMatrix(matrix: Matrix?): Matrix {
- var matrix = matrix
- if (matrix == null) {
- matrix = Matrix()
- } else {
- matrix.reset()
+ val m = matrix?:Matrix().let {
+ it.reset()
+ it
}
if (isReady) {
+ val imgX = drawable.intrinsicWidth.toFloat()
+ val imgY = drawable.intrinsicHeight.toFloat()
//原图大小
- val tempSrc = MathUtils.rectFTake(
- 0f,
- 0f,
- drawable.intrinsicWidth.toFloat(),
- drawable.intrinsicHeight.toFloat()
- )
+ val tempSrc = rectFTake(0f, 0f, imgX, imgY)
+ //layoutParams.height = (imgY / imgX * width + 0.5).toInt()
+ //invalidate()
//控件大小
- val tempDst = MathUtils.rectFTake(
- 0f,
- 0f,
- width.toFloat(),
- height.toFloat()
- )
+ val tempDst = rectFTake(0f, 0f, width.toFloat(), height.toFloat())
//计算fit center矩阵
- matrix.setRectToRect(tempSrc, tempDst, Matrix.ScaleToFit.CENTER)
+ m.setRectToRect(tempSrc, tempDst, Matrix.ScaleToFit.CENTER)
//释放临时对象
- MathUtils.rectFGiven(tempDst)
- MathUtils.rectFGiven(tempSrc)
+ rectFGiven(tempDst)
+ rectFGiven(tempSrc)
}
- return matrix
+ return m
+ }
+
+ fun setHeight2FitImgWidth(){
+ matrix.reset()
+ val imgX = drawable.intrinsicWidth.toFloat()
+ val imgY = drawable.intrinsicHeight.toFloat()
+ //Log.d("MySIV", "ix: $imgX, iy: $imgY, w: $width, h: $height")
+ //原图大小
+ val tempSrc = rectFTake(0f, 0f, imgX, imgY)
+ layoutParams.height = (imgY / imgX * width + 0.5).toInt()
+ invalidate()
+ //控件大小
+ val tempDst = rectFTake(0f, 0f, width.toFloat(), height.toFloat())
+ //计算fit center矩阵
+ matrix.setRectToRect(tempSrc, tempDst, Matrix.ScaleToFit.CENTER)
+ //释放临时对象
+ rectFGiven(tempDst)
+ rectFGiven(tempSrc)
}
/**
@@ -161,11 +171,10 @@ class ScaleImageView : ImageView {
*/
private fun getCurrentImageMatrix(matrix: Matrix): Matrix {
//获取内部变换矩阵
- var matrix = matrix
- matrix = getInnerMatrix(matrix)
+ val m = getInnerMatrix(matrix)
//乘上外部变换矩阵
- matrix.postConcat(mOuterMatrix)
- return matrix
+ m.postConcat(mOuterMatrix)
+ return m
}
/**
@@ -179,26 +188,20 @@ class ScaleImageView : ImageView {
* @see .getCurrentImageMatrix
*/
private fun getImageBound(rectF: RectF?): RectF {
- var rectF = rectF
- if (rectF == null) {
- rectF = RectF()
- } else {
- rectF.setEmpty()
- }
- return if (!isReady) {
- rectF
- } else {
+ var rf = rectF
+ if (rf == null) rf = RectF() else rf.setEmpty()
+ if (isReady) {
//申请一个空matrix
- val matrix = MathUtils.matrixTake()
+ val matrix = matrixTake()
//获取当前总变换矩阵
getCurrentImageMatrix(matrix)
//对原图矩形进行变换得到当前显示矩形
- rectF[0f, 0f, drawable.intrinsicWidth.toFloat()] = drawable.intrinsicHeight.toFloat()
- matrix.mapRect(rectF)
+ rf[0f, 0f, drawable.intrinsicWidth.toFloat()] = drawable.intrinsicHeight.toFloat()
+ matrix.mapRect(rf)
//释放临时matrix
- MathUtils.matrixGiven(matrix)
- rectF
+ matrixGiven(matrix)
}
+ return rf
}
/**
@@ -207,11 +210,11 @@ class ScaleImageView : ImageView {
* @return 返回当前的mask对象副本,如果当前没有设置mask则返回null
val mask: RectF?
- get() = if (mMask != null) {
- RectF(mMask)
- } else {
- null
- }*/
+ get() = if (mMask != null) {
+ RectF(mMask)
+ } else {
+ null
+ }*/
/**
* 与ViewPager结合的时候使用
@@ -259,29 +262,29 @@ class ScaleImageView : ImageView {
* 调用此方法会停止正在进行中的手势以及手势动画.
* 当duration为0时,outerMatrix值会被立即设置而不会启动动画.
*
- @param endMatrix 动画目标矩阵
- @param duration 动画持续时间
+ @param endMatrix 动画目标矩阵
+ @param duration 动画持续时间
*
- @see .getOuterMatrix
+ @see .getOuterMatrix
fun outerMatrixTo(endMatrix: Matrix?, duration: Long) {
- if (endMatrix == null) {
- return
- }
- //将手势设置为PINCH_MODE_FREE将停止后续手势的触发
- pinchMode = PINCH_MODE_FREE
- //停止所有正在进行的动画
- cancelAllAnimator()
- //如果时间不合法立即执行结果
- if (duration <= 0) {
- mOuterMatrix.set(endMatrix)
- dispatchOuterMatrixChanged()
- invalidate()
- } else {
- //创建矩阵变化动画
- mScaleAnimator = ScaleAnimator(mOuterMatrix, endMatrix, duration)
- mScaleAnimator!!.start()
- }
+ if (endMatrix == null) {
+ return
+ }
+ //将手势设置为PINCH_MODE_FREE将停止后续手势的触发
+ pinchMode = PINCH_MODE_FREE
+ //停止所有正在进行的动画
+ cancelAllAnimator()
+ //如果时间不合法立即执行结果
+ if (duration <= 0) {
+ mOuterMatrix.set(endMatrix)
+ dispatchOuterMatrixChanged()
+ invalidate()
+ } else {
+ //创建矩阵变化动画
+ mScaleAnimator = ScaleAnimator(mOuterMatrix, endMatrix, duration)
+ mScaleAnimator!!.start()
+ }
}*/
/**
@@ -291,32 +294,32 @@ class ScaleImageView : ImageView {
* 当前mask为null时,则不执行动画立即设置为目标mask.
* 当duration为0时,立即将当前mask设置为目标mask,不会执行动画.
*
- @param mask 动画目标mask
- @param duration 动画持续时间
+ @param mask 动画目标mask
+ @param duration 动画持续时间
*
- @see .getMask
+ @see .getMask
fun zoomMaskTo(mask: RectF?, duration: Long) {
- if (mask == null) {
- return
- }
- //停止mask动画
- if (mMaskAnimator != null) {
- mMaskAnimator!!.cancel()
- mMaskAnimator = null
- }
- //如果duration为0或者之前没有设置过mask,不执行动画,立即设置
- if (duration <= 0 || mMask == null) {
- if (mMask == null) {
- mMask = RectF()
- }
- mMask!!.set(mask)
- invalidate()
- } else {
- //执行mask动画
- mMaskAnimator = MaskAnimator(mMask!!, mask, duration)
- mMaskAnimator!!.start()
- }
+ if (mask == null) {
+ return
+ }
+ //停止mask动画
+ if (mMaskAnimator != null) {
+ mMaskAnimator!!.cancel()
+ mMaskAnimator = null
+ }
+ //如果duration为0或者之前没有设置过mask,不执行动画,立即设置
+ if (duration <= 0 || mMask == null) {
+ if (mMask == null) {
+ mMask = RectF()
+ }
+ mMask!!.set(mask)
+ invalidate()
+ } else {
+ //执行mask动画
+ mMaskAnimator = MaskAnimator(mMask!!, mask, duration)
+ mMaskAnimator!!.start()
+ }
}*/
/**
@@ -326,24 +329,24 @@ class ScaleImageView : ImageView {
* 但不清空drawable,以及事件绑定相关数据.
fun reset() {
- //重置位置到fit
- mOuterMatrix.reset()
- dispatchOuterMatrixChanged()
- //清空mask
- mMask = null
- //停止所有手势
- pinchMode = PINCH_MODE_FREE
- mLastMovePoint[0f] = 0f
- mScaleCenter[0f] = 0f
- mScaleBase = 0f
- //停止所有动画
- if (mMaskAnimator != null) {
- mMaskAnimator!!.cancel()
- mMaskAnimator = null
- }
- cancelAllAnimator()
- //重绘
- invalidate()
+ //重置位置到fit
+ mOuterMatrix.reset()
+ dispatchOuterMatrixChanged()
+ //清空mask
+ mMask = null
+ //停止所有手势
+ pinchMode = PINCH_MODE_FREE
+ mLastMovePoint[0f] = 0f
+ mScaleCenter[0f] = 0f
+ mScaleBase = 0f
+ //停止所有动画
+ if (mMaskAnimator != null) {
+ mMaskAnimator!!.cancel()
+ mMaskAnimator = null
+ }
+ cancelAllAnimator()
+ //重绘
+ invalidate()
}*/
////////////////////////////////对外广播事件////////////////////////////////
/**
@@ -396,64 +399,64 @@ class ScaleImageView : ImageView {
/**
* 添加外部矩阵变化监听
*
- @param listener
+ @param listener
fun addOuterMatrixChangedListener(listener: OuterMatrixChangedListener?) {
- if (listener == null) {
- return
- }
- //如果监听列表没有被修改锁定直接将监听添加到监听列表
- if (mDispatchOuterMatrixChangedLock == 0) {
- if (mOuterMatrixChangedListeners == null) {
- mOuterMatrixChangedListeners =
- ArrayList()
- }
- mOuterMatrixChangedListeners!!.add(listener)
- } else {
- //如果监听列表修改被锁定,那么尝试在监听列表副本上添加
- //监听列表副本将会在锁定被解除时替换到监听列表里
- if (mOuterMatrixChangedListenersCopy == null) {
- mOuterMatrixChangedListenersCopy = if (mOuterMatrixChangedListeners != null) {
- ArrayList(
- mOuterMatrixChangedListeners!!
- )
- } else {
- ArrayList()
- }
- }
- mOuterMatrixChangedListenersCopy!!.add(listener)
- }
+ if (listener == null) {
+ return
+ }
+ //如果监听列表没有被修改锁定直接将监听添加到监听列表
+ if (mDispatchOuterMatrixChangedLock == 0) {
+ if (mOuterMatrixChangedListeners == null) {
+ mOuterMatrixChangedListeners =
+ ArrayList()
+ }
+ mOuterMatrixChangedListeners!!.add(listener)
+ } else {
+ //如果监听列表修改被锁定,那么尝试在监听列表副本上添加
+ //监听列表副本将会在锁定被解除时替换到监听列表里
+ if (mOuterMatrixChangedListenersCopy == null) {
+ mOuterMatrixChangedListenersCopy = if (mOuterMatrixChangedListeners != null) {
+ ArrayList(
+ mOuterMatrixChangedListeners!!
+ )
+ } else {
+ ArrayList()
+ }
+ }
+ mOuterMatrixChangedListenersCopy!!.add(listener)
+ }
}*/
/**
* 删除外部矩阵变化监听
*
- @param listener
+ @param listener
fun removeOuterMatrixChangedListener(listener: OuterMatrixChangedListener?) {
- if (listener == null) {
- return
- }
- //如果监听列表没有被修改锁定直接在监听列表数据结构上修改
- if (mDispatchOuterMatrixChangedLock == 0) {
- if (mOuterMatrixChangedListeners != null) {
- mOuterMatrixChangedListeners!!.remove(listener)
- }
- } else {
- //如果监听列表被修改锁定,那么就在其副本上修改
- //其副本将会在锁定解除时替换回监听列表
- if (mOuterMatrixChangedListenersCopy == null) {
- if (mOuterMatrixChangedListeners != null) {
- mOuterMatrixChangedListenersCopy =
- ArrayList(
- mOuterMatrixChangedListeners!!
- )
- }
- }
- if (mOuterMatrixChangedListenersCopy != null) {
- mOuterMatrixChangedListenersCopy!!.remove(listener)
- }
- }
+ if (listener == null) {
+ return
+ }
+ //如果监听列表没有被修改锁定直接在监听列表数据结构上修改
+ if (mDispatchOuterMatrixChangedLock == 0) {
+ if (mOuterMatrixChangedListeners != null) {
+ mOuterMatrixChangedListeners!!.remove(listener)
+ }
+ } else {
+ //如果监听列表被修改锁定,那么就在其副本上修改
+ //其副本将会在锁定解除时替换回监听列表
+ if (mOuterMatrixChangedListenersCopy == null) {
+ if (mOuterMatrixChangedListeners != null) {
+ mOuterMatrixChangedListenersCopy =
+ ArrayList(
+ mOuterMatrixChangedListeners!!
+ )
+ }
+ }
+ if (mOuterMatrixChangedListenersCopy != null) {
+ mOuterMatrixChangedListenersCopy!!.remove(listener)
+ }
+ }
}*/
/**
@@ -508,11 +511,9 @@ class ScaleImageView : ImageView {
outerScale: Float
): Float {
val currentScale = innerScale * outerScale
- return if (currentScale < maxScale) {
- maxScale
- } else {
- innerScale
- }
+ Log.d("MySIV", "current scale: $currentScale, max scale: $maxScale")
+ return if (currentScale < maxScale * 0.9f) maxScale
+ else innerScale
}
////////////////////////////////初始化////////////////////////////////
@@ -520,10 +521,7 @@ class ScaleImageView : ImageView {
initView()
}
- constructor(context: Context?, attrs: AttributeSet?) : super(
- context,
- attrs
- ) {
+ constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
initView()
}
@@ -548,9 +546,9 @@ class ScaleImageView : ImageView {
try {
//在绘制前设置变换矩阵
if (isReady) {
- val matrix = MathUtils.matrixTake()
+ val matrix = matrixTake()
imageMatrix = getCurrentImageMatrix(matrix)
- MathUtils.matrixGiven(matrix)
+ matrixGiven(matrix)
}
//对图像做遮罩处理
if (mMask != null) {
@@ -563,7 +561,7 @@ class ScaleImageView : ImageView {
}
}catch (e:Exception){
e.printStackTrace()
- ViewMangaActivity.va?.get()?.toolsBox?.toastError("图片加载错误", false)
+ ViewMangaActivity.va?.get()?.toolsBox?.toastError("图片加载错误,请尝试下载后使用较低图片质量查看", false)
}
}
////////////////////////////////有效性判断////////////////////////////////
@@ -576,75 +574,6 @@ class ScaleImageView : ImageView {
*/
private val isReady: Boolean
get() = drawable != null && drawable.intrinsicWidth > 0 && drawable.intrinsicHeight > 0 && width > 0 && height > 0
- ////////////////////////////////mask动画处理////////////////////////////////
- /**
- * mask修改的动画
- *
- * 和图片的动画相互独立.
- *
- @see .zoomMaskTo
- */
- //private var mMaskAnimator: MaskAnimator? = null
-
- /**
- * mask变换动画
- *
- * 将mask从一个rect动画到另外一个rect
-
- private inner class MaskAnimator(start: RectF, end: RectF, duration: Long) :
- ValueAnimator(), AnimatorUpdateListener {
- /**
- * 开始mask
- */
- private val mStart = FloatArray(4)
-
- /**
- * 结束mask
- */
- private val mEnd = FloatArray(4)
-
- /**
- * 中间结果mask
- */
- private val mResult = FloatArray(4)
- override fun onAnimationUpdate(animation: ValueAnimator) {
- //获取动画进度,0-1范围
- val value = animation.animatedValue as Float
- //根据进度对起点终点之间做插值
- for (i in 0..3) {
- mResult[i] = mStart[i] + (mEnd[i] - mStart[i]) * value
- }
- //期间mask有可能被置空了,所以判断一下
- if (mMask == null) {
- mMask = RectF()
- }
- //设置新的mask并绘制
- mMask!![mResult[0], mResult[1], mResult[2]] = mResult[3]
- invalidate()
- }
-
- /**
- * 创建mask变换动画
- *
- @param start 动画起始状态
- @param end 动画终点状态
- @param duration 动画持续时间
- */
- init {
- setFloatValues(0f, 1f)
- setDuration(duration)
- addUpdateListener(this)
- //将起点终点拷贝到数组方便计算
- mStart[0] = start.left
- mStart[1] = start.top
- mStart[2] = start.right
- mStart[3] = start.bottom
- mEnd[0] = end.left
- mEnd[1] = end.top
- mEnd[2] = end.right
- mEnd[3] = end.bottom
- }
- }*/
////////////////////////////////手势动画处理////////////////////////////////
/**
* 在单指模式下:
@@ -654,10 +583,10 @@ class ScaleImageView : ImageView {
* 记录两个手指的中点,作为和mScaleCenter绑定的点.
* 这个绑定可以保证mScaleCenter无论如何都会跟随这个中点.
*
- @see .mScaleCenter
+ @see .mScaleCenter
*
- @see .scale
- @see .scaleEnd
+ @see .scale
+ @see .scaleEnd
*/
private val mLastMovePoint = PointF()
@@ -745,7 +674,7 @@ class ScaleImageView : ImageView {
}
var v :WeakReference? = null
- var pm: PagesManager? = null
+ var pm:PagesManager? = null
override fun onSingleTapConfirmed(event: MotionEvent): Boolean {
if(v == null) {
v = ViewMangaActivity.va
@@ -766,14 +695,14 @@ class ScaleImageView : ImageView {
}
})
private val isBig: Boolean
- get() = MathUtils.getMatrixScale(mOuterMatrix)[0] > 1f
+ get() = getMatrixScale(mOuterMatrix)[0] > 1f
@ExperimentalStdlibApi
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
super.onTouchEvent(event)
val action = event.action and MotionEvent.ACTION_MASK
- Log.d("MySi", "Outer Scale: ${MathUtils.getMatrixScale(mOuterMatrix)[0]}")
+ Log.d("MySi", "Outer Scale: ${getMatrixScale(mOuterMatrix)[0]}")
//最后一个点抬起或者取消,结束所有模式
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
//如果之前是缩放模式,还需要触发一下缩放结束动画
@@ -829,14 +758,14 @@ class ScaleImageView : ImageView {
//在缩放模式下移动
} else if (pinchMode == PINCH_MODE_SCALE && event.pointerCount > 1) {
//两个缩放点间的距离
- val distance = MathUtils.getDistance(
+ val distance = getDistance(
event.getX(0),
event.getY(0),
event.getX(1),
event.getY(1)
)
//保存缩放点中点
- val lineCenter = MathUtils.getCenterPoint(
+ val lineCenter = getCenterPoint(
event.getX(0),
event.getY(0),
event.getX(1),
@@ -869,7 +798,7 @@ class ScaleImageView : ImageView {
return false
}
//原图方框
- val bound = MathUtils.rectFTake()
+ val bound = rectFTake()
getImageBound(bound)
//控件大小
val displayWidth = width.toFloat()
@@ -927,7 +856,7 @@ class ScaleImageView : ImageView {
//触发重绘
//检查是否有变化
}
- MathUtils.rectFGiven(bound)
+ rectFGiven(bound)
//应用移动变换
mOuterMatrix.postTranslate(xDiff, yDiff)
dispatchOuterMatrixChanged()
@@ -959,13 +888,13 @@ class ScaleImageView : ImageView {
//但是有可能外部设定了不规范的值.
//但是后续的scale操作会将xy不等的缩放值纠正,改成和x方向相同
mScaleBase =
- MathUtils.getMatrixScale(mOuterMatrix)[0] / MathUtils.getDistance(x1, y1, x2, y2)
+ getMatrixScale(mOuterMatrix)[0] / getDistance(x1, y1, x2, y2)
//两手指的中点在屏幕上落在了图片的某个点上,图片上的这个点在经过总矩阵变换后和手指中点相同
//现在我们需要得到图片上这个点在图片是fit center状态下在屏幕上的位置
//因为后续的计算都是基于图片是fit center状态下进行变换
//所以需要把两手指中点除以外层变换矩阵得到mScaleCenter
- val center = MathUtils.inverseMatrixPoint(
- MathUtils.getCenterPoint(
+ val center = inverseMatrixPoint(
+ getCenterPoint(
x1,
y1,
x2,
@@ -998,14 +927,14 @@ class ScaleImageView : ImageView {
}
//计算图片从fit center状态到目标状态的缩放比例
val scale = scaleBase * distance
- val matrix = MathUtils.matrixTake()
+ val matrix = matrixTake()
//按照图片缩放中心缩放,并且让缩放中心在缩放点中点上
matrix.postScale(scale, scale, scaleCenter.x, scaleCenter.y)
//让图片的缩放中点跟随手指缩放中点
matrix.postTranslate(lineCenter.x - scaleCenter.x, lineCenter.y - scaleCenter.y)
//应用变换
mOuterMatrix.set(matrix)
- MathUtils.matrixGiven(matrix)
+ matrixGiven(matrix)
dispatchOuterMatrixChanged()
//重绘
invalidate()
@@ -1029,11 +958,11 @@ class ScaleImageView : ImageView {
return
}
//获取第一层变换矩阵
- val innerMatrix = MathUtils.matrixTake()
+ val innerMatrix = matrixTake()
getInnerMatrix(innerMatrix)
//当前总的缩放比例
- val innerScale = MathUtils.getMatrixScale(innerMatrix)[0]
- val outerScale = MathUtils.getMatrixScale(mOuterMatrix)[0]
+ val innerScale = getMatrixScale(innerMatrix)[0]
+ val outerScale = getMatrixScale(mOuterMatrix)[0]
val currentScale = innerScale * outerScale
//控件大小
val displayWidth = width.toFloat()
@@ -1043,6 +972,7 @@ class ScaleImageView : ImageView {
//接下来要放大的大小
var nextScale = calculateNextScale(innerScale, outerScale)
//如果接下来放大大于最大值或者小于fit center值,则取边界
+ Log.d("MySIV", "Next scale: $nextScale, Max scale: $maxScale, Inner scale: $innerScale")
if (nextScale > maxScale) {
nextScale = maxScale
}
@@ -1050,15 +980,15 @@ class ScaleImageView : ImageView {
nextScale = innerScale
}
//开始计算缩放动画的结果矩阵
- val animEnd = MathUtils.matrixTake(mOuterMatrix)
+ val animEnd = matrixTake(mOuterMatrix)
//计算还需缩放的倍数
animEnd.postScale(nextScale / currentScale, nextScale / currentScale, x, y)
//将放大点移动到控件中心
animEnd.postTranslate(displayWidth / 2f - x, displayHeight / 2f - y)
//得到放大之后的图片方框
- val testMatrix = MathUtils.matrixTake(innerMatrix)
+ val testMatrix = matrixTake(innerMatrix)
testMatrix.postConcat(animEnd)
- val testBound = MathUtils.rectFTake(
+ val testBound = rectFTake(
0f,
0f,
drawable.intrinsicWidth.toFloat(),
@@ -1106,10 +1036,10 @@ class ScaleImageView : ImageView {
mScaleAnimator = ScaleAnimator(mOuterMatrix, animEnd)
mScaleAnimator!!.start()
//清理临时变量
- MathUtils.rectFGiven(testBound)
- MathUtils.matrixGiven(testMatrix)
- MathUtils.matrixGiven(animEnd)
- MathUtils.matrixGiven(innerMatrix)
+ rectFGiven(testBound)
+ matrixGiven(testMatrix)
+ matrixGiven(animEnd)
+ matrixGiven(innerMatrix)
}
/**
@@ -1125,13 +1055,13 @@ class ScaleImageView : ImageView {
//是否修正了位置
var change = false
//获取图片整体的变换矩阵
- val currentMatrix = MathUtils.matrixTake()
+ val currentMatrix = matrixTake()
getCurrentImageMatrix(currentMatrix)
//整体缩放比例
val currentScale =
- MathUtils.getMatrixScale(currentMatrix)[0]
+ getMatrixScale(currentMatrix)[0]
//第二层缩放比例
- val outerScale = MathUtils.getMatrixScale(mOuterMatrix)[0]
+ val outerScale = getMatrixScale(mOuterMatrix)[0]
//控件大小
val displayWidth = width.toFloat()
val displayHeight = height.toFloat()
@@ -1155,9 +1085,9 @@ class ScaleImageView : ImageView {
change = true
}
//尝试根据缩放点进行缩放修正
- val testMatrix = MathUtils.matrixTake(currentMatrix)
+ val testMatrix = matrixTake(currentMatrix)
testMatrix.postScale(scalePost, scalePost, mLastMovePoint.x, mLastMovePoint.y)
- val testBound = MathUtils.rectFTake(
+ val testBound = rectFTake(
0f,
0f,
drawable.intrinsicWidth.toFloat(),
@@ -1215,7 +1145,7 @@ class ScaleImageView : ImageView {
//只有有执行修正才执行动画
if (change) {
//计算结束矩阵
- val animEnd = MathUtils.matrixTake(mOuterMatrix)
+ val animEnd = matrixTake(mOuterMatrix)
animEnd.postScale(scalePost, scalePost, mLastMovePoint.x, mLastMovePoint.y)
animEnd.postTranslate(postX, postY)
//清理当前可能正在执行的动画
@@ -1224,12 +1154,12 @@ class ScaleImageView : ImageView {
mScaleAnimator = ScaleAnimator(mOuterMatrix, animEnd)
mScaleAnimator!!.start()
//清理临时变量
- MathUtils.matrixGiven(animEnd)
+ matrixGiven(animEnd)
}
//清理临时变量
- MathUtils.rectFGiven(testBound)
- MathUtils.matrixGiven(testMatrix)
- MathUtils.matrixGiven(currentMatrix)
+ rectFGiven(testBound)
+ matrixGiven(testMatrix)
+ matrixGiven(currentMatrix)
}
/**
@@ -1288,7 +1218,7 @@ class ScaleImageView : ImageView {
mVector[0] *= FLING_DAMPING_FACTOR
mVector[1] *= FLING_DAMPING_FACTOR
//速度太小或者不能移动了就结束
- if (!result || MathUtils.getDistance(
+ if (!result || getDistance(
0f,
0f,
mVector[0],
@@ -1304,8 +1234,8 @@ class ScaleImageView : ImageView {
*
* 参数单位为 像素/帧
*
- @param vectorX 速度向量
- @param vectorY 速度向量
+ @param vectorX 速度向量
+ @param vectorY 速度向量
*/
init {
setFloatValues(0f, 1f)
@@ -1366,8 +1296,8 @@ class ScaleImageView : ImageView {
*
* 从一个矩阵变换到另外一个矩阵
*
- @param start 开始矩阵
- @param end 结束矩阵
+ @param start 开始矩阵
+ @param end 结束矩阵
*/
init {
setFloatValues(0f, 1f)
@@ -1457,7 +1387,7 @@ class ScaleImageView : ImageView {
/**
* 创建一个对象池
*
- @param size 对象池最大容量
+ @param size 对象池最大容量
*/
init {
mQueue = LinkedList()
@@ -1496,7 +1426,7 @@ class ScaleImageView : ImageView {
/**
* 数学计算工具类
*/
- object MathUtils {
+ companion object {
/**
* 矩阵对象池
*/
@@ -1505,9 +1435,7 @@ class ScaleImageView : ImageView {
/**
* 获取矩阵对象
*/
- fun matrixTake(): Matrix {
- return mMatrixPool.take()!!
- }
+ fun matrixTake() = mMatrixPool.take()!!
/**
* 获取某个矩阵的copy
@@ -1557,11 +1485,11 @@ class ScaleImageView : ImageView {
* 获取某个矩形的副本
fun rectFTake(rectF: RectF?): RectF {
- val result = mRectFPool.take()!!
- if (rectF != null) {
- result.set(rectF)
- }
- return result
+ val result = mRectFPool.take()!!
+ if (rectF != null) {
+ result.set(rectF)
+ }
+ return result
}*/
/**
@@ -1653,192 +1581,6 @@ class ScaleImageView : ImageView {
FloatArray(2)
}
}
-
- /**
- * 计算两个矩形之间的变换矩阵
- *
- * unknownMatrix.mapRect(to, from)
- * 已知from矩形和to矩形,求unknownMatrix
- *
- @param from
- @param to
- @param result unknownMatrix
-
- fun calculateRectTranslateMatrix(
- from: RectF?,
- to: RectF?,
- result: Matrix?
- ) {
- if (from == null || to == null || result == null) {
- return
- }
- if (from.width() == 0f || from.height() == 0f) {
- return
- }
- result.reset()
- result.postTranslate(-from.left, -from.top)
- result.postScale(to.width() / from.width(), to.height() / from.height())
- result.postTranslate(to.left, to.top)
- }*/
-
- /**
- * 计算图片在某个ImageView中的显示矩形
- *
- @param container ImageView的Rect
- @param srcWidth 图片的宽度
- @param srcHeight 图片的高度
- @param scaleType 图片在ImageView中的ScaleType
- @param result 图片应该在ImageView中展示的矩形
-
- fun calculateScaledRectInContainer(
- container: RectF?,
- srcWidth: Float,
- srcHeight: Float,
- scaleType: ScaleType?,
- result: RectF?
- ) {
- var scaleType = scaleType
- if (container == null || result == null) {
- return
- }
- if (srcWidth == 0f || srcHeight == 0f) {
- return
- }
- //默认scaleType为fit center
- if (scaleType == null) {
- scaleType = ScaleType.FIT_CENTER
- }
- result.setEmpty()
- if (ScaleType.FIT_XY == scaleType) {
- result.set(container)
- } else if (ScaleType.CENTER == scaleType) {
- val matrix = matrixTake()
- val rect = rectFTake(0f, 0f, srcWidth, srcHeight)
- matrix.setTranslate(
- (container.width() - srcWidth) * 0.5f,
- (container.height() - srcHeight) * 0.5f
- )
- matrix.mapRect(result, rect)
- rectFGiven(rect)
- matrixGiven(matrix)
- result.left += container.left
- result.right += container.left
- result.top += container.top
- result.bottom += container.top
- } else if (ScaleType.CENTER_CROP == scaleType) {
- val matrix = matrixTake()
- val rect = rectFTake(0f, 0f, srcWidth, srcHeight)
- val scale: Float
- var dx = 0f
- var dy = 0f
- if (srcWidth * container.height() > container.width() * srcHeight) {
- scale = container.height() / srcHeight
- dx = (container.width() - srcWidth * scale) * 0.5f
- } else {
- scale = container.width() / srcWidth
- dy = (container.height() - srcHeight * scale) * 0.5f
- }
- matrix.setScale(scale, scale)
- matrix.postTranslate(dx, dy)
- matrix.mapRect(result, rect)
- rectFGiven(rect)
- matrixGiven(matrix)
- result.left += container.left
- result.right += container.left
- result.top += container.top
- result.bottom += container.top
- } else if (ScaleType.CENTER_INSIDE == scaleType) {
- val matrix = matrixTake()
- val rect = rectFTake(0f, 0f, srcWidth, srcHeight)
- val scale: Float
- val dx: Float
- val dy: Float
- scale = if (srcWidth <= container.width() && srcHeight <= container.height()) {
- 1f
- } else {
- Math.min(
- container.width() / srcWidth,
- container.height() / srcHeight
- )
- }
- dx = (container.width() - srcWidth * scale) * 0.5f
- dy = (container.height() - srcHeight * scale) * 0.5f
- matrix.setScale(scale, scale)
- matrix.postTranslate(dx, dy)
- matrix.mapRect(result, rect)
- rectFGiven(rect)
- matrixGiven(matrix)
- result.left += container.left
- result.right += container.left
- result.top += container.top
- result.bottom += container.top
- } else if (ScaleType.FIT_CENTER == scaleType) {
- val matrix = matrixTake()
- val rect = rectFTake(0f, 0f, srcWidth, srcHeight)
- val tempSrc = rectFTake(0f, 0f, srcWidth, srcHeight)
- val tempDst = rectFTake(
- 0f,
- 0f,
- container.width(),
- container.height()
- )
- matrix.setRectToRect(tempSrc, tempDst, Matrix.ScaleToFit.CENTER)
- matrix.mapRect(result, rect)
- rectFGiven(tempDst)
- rectFGiven(tempSrc)
- rectFGiven(rect)
- matrixGiven(matrix)
- result.left += container.left
- result.right += container.left
- result.top += container.top
- result.bottom += container.top
- } else if (ScaleType.FIT_START == scaleType) {
- val matrix = matrixTake()
- val rect = rectFTake(0f, 0f, srcWidth, srcHeight)
- val tempSrc = rectFTake(0f, 0f, srcWidth, srcHeight)
- val tempDst = rectFTake(
- 0f,
- 0f,
- container.width(),
- container.height()
- )
- matrix.setRectToRect(tempSrc, tempDst, Matrix.ScaleToFit.START)
- matrix.mapRect(result, rect)
- rectFGiven(tempDst)
- rectFGiven(tempSrc)
- rectFGiven(rect)
- matrixGiven(matrix)
- result.left += container.left
- result.right += container.left
- result.top += container.top
- result.bottom += container.top
- } else if (ScaleType.FIT_END == scaleType) {
- val matrix = matrixTake()
- val rect = rectFTake(0f, 0f, srcWidth, srcHeight)
- val tempSrc = rectFTake(0f, 0f, srcWidth, srcHeight)
- val tempDst = rectFTake(
- 0f,
- 0f,
- container.width(),
- container.height()
- )
- matrix.setRectToRect(tempSrc, tempDst, Matrix.ScaleToFit.END)
- matrix.mapRect(result, rect)
- rectFGiven(tempDst)
- rectFGiven(tempSrc)
- rectFGiven(rect)
- matrixGiven(matrix)
- result.left += container.left
- result.right += container.left
- result.top += container.top
- result.bottom += container.top
- } else {
- result.set(container)
- }
- }*/
- }
-
- companion object {
////////////////////////////////配置参数////////////////////////////////
/**
* 图片缩放动画时间
diff --git a/app/src/main/res/drawable-anydpi/bg_comment.xml b/app/src/main/res/drawable-anydpi/bg_comment.xml
deleted file mode 100644
index 29a9969..0000000
--- a/app/src/main/res/drawable-anydpi/bg_comment.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/button_tbutton.xml b/app/src/main/res/layout/button_tbutton.xml
index 964645f..ebaae01 100644
--- a/app/src/main/res/layout/button_tbutton.xml
+++ b/app/src/main/res/layout/button_tbutton.xml
@@ -1,5 +1,5 @@
-