diff --git a/app/build.gradle b/app/build.gradle index 2ef9fbe..0baf4fe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,7 +32,7 @@ android { minSdkVersion 21 targetSdkVersion 30 versionCode 2 - versionName "1.1.6" + versionName "1.1.6r2" ndk { //设置支持的SO库架构 diff --git a/app/release/app-release.apk b/app/release/app-release.apk index 45fc1db..11c049e 100644 Binary files a/app/release/app-release.apk and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 0f2dd3c..5751555 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,7 +11,7 @@ "type": "SINGLE", "filters": [], "versionCode": 2, - "versionName": "1.1.6", + "versionName": "1.1.6r2", "outputFile": "app-release.apk" } ] diff --git a/app/src/main/java/com/novel/qingwen/view/activity/ReadActivity.kt b/app/src/main/java/com/novel/qingwen/view/activity/ReadActivity.kt index 3d65500..dbef896 100644 --- a/app/src/main/java/com/novel/qingwen/view/activity/ReadActivity.kt +++ b/app/src/main/java/com/novel/qingwen/view/activity/ReadActivity.kt @@ -259,7 +259,7 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha if (index < 0) return //让列表更加快速的定位 contentsManager.scrollToPosition(index) - contentsManager.smoothScrollToPosition(contentsList,RecyclerView.State(),index) + contentsManager.smoothScrollToPosition(contentsList, RecyclerView.State(), index) } } @@ -358,7 +358,7 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha val item = contentViewModel.getList()[index] //避免重复加载 readHead.text = item.name - if (item.chapterId == currentReadID)return + if (item.chapterId == currentReadID) return currentReadID = item.chapterId if (index == contentViewModel.getList().size - 1) { if (contentViewModel.getList()[index].nid != -1L) { @@ -374,7 +374,7 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha } } } else if (index == 0 && contentViewModel.getList()[0].pid != -1L) { - if (item.chapterId == currentReadID)return + if (item.chapterId == currentReadID) return contentViewModel.cancelPrepare() if (!firstRun) contentViewModel.prepareChapter(0) @@ -385,7 +385,6 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { //设置界面处于开启状态 不处理滑动加载事件 if (isOpen) return -// "now canScrollUp=${readList.canScrollVertically(-1)} canScrollDown=${readList.canScrollVertically(1)}") //取消预加载 contentViewModel.cancelPrepare() //加载下一章 @@ -393,6 +392,9 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha && newState == RecyclerView.SCROLL_STATE_IDLE//当前recyclerview停止滑动 && !readList.canScrollVertically(1) //recyclerview无法向上滑动时 ) { + if (loadLock && autoScrollRunning){ + return + } nextChapter() super.onScrollStateChanged(recyclerView, newState) return @@ -468,7 +470,6 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha }) contentsInit() } - //自定义 重写了smoothScrollToPosition方法 实现修改滑动时间 // private val contentsManager = ContentsActivity.MyLinearLayoutManager(this) private val contentsManager = CenterLayoutManager(this) @@ -482,7 +483,7 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha private var currentHeadViewIndex: Int = 0 //数据由viewModel保管 数据视图分离 - private val headList by lazy { contentsViewModel.getHeadList() } + private val headList by lazy { contentsViewModel.getHeadList()} //初始化右侧的目录页 private fun contentsInit() { @@ -499,6 +500,7 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha //清空阅读位置记录 readOffset = 0 dialog.show() + firstRun = true contentViewModel.getChapter(item.id) readDrawerLayout.closeDrawer(Gravity.RIGHT) closeSetting() @@ -606,16 +608,6 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha //选中当前章节位置 selectChapterItem() -// var index = 0 -// contentsViewModel.getList().forEach { -// if (it.id == chapterId) { -//// contentsList.scrollToPosition(index) -// selectChapterItem() -// //contentsList.smoothScrollToPosition() -// return@forEach -// } -// index++ -// } } } }) @@ -633,7 +625,7 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha headView.text = headList[headList.size - 1].name if (contentsAdapter.itemCount > 0) // contentsManager.scrollToPosition(contentsAdapter.itemCount - 1) - contentsList.scrollToPosition(contentsAdapter.itemCount - 1) + contentsList.scrollToPosition(contentsAdapter.itemCount - 1) } readLocation.setOnClickListener { selectChapterItem() @@ -678,8 +670,9 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha if (nid == -1L) { if (status == "状态:完结") showSuccess("恭喜你又读完一本书。") - else + else { loadLock = false + } return } //加载下一章 @@ -689,8 +682,14 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha override fun showMsg(msg: String) { showError(msg) - if (loadLock) + if (loadLock) { loadLock = false + if (autoScrollRunning) { + PageScrollController.stop() + findViewById(R.id.readAutoScroll).callOnClick() + show("阅读结束") + } + } if (dialog.isShowing) dialog.dismiss() } @@ -718,7 +717,7 @@ class ReadActivity : AppCompatActivity(), IBaseView, CustomSeekBar.OnProgressCha readList.scrollBy(0, -readOffset) //加载上下章节 contentViewModel.prepareChapter(0) - contentViewModel.prepareChapter(contentAdapter.itemCount-1) + contentViewModel.prepareChapter(contentAdapter.itemCount - 1) firstRun = false } } diff --git a/app/src/main/java/com/novel/qingwen/view/activity/ResumeActivity.kt b/app/src/main/java/com/novel/qingwen/view/activity/ResumeActivity.kt index 09f5aab..a93b70f 100644 --- a/app/src/main/java/com/novel/qingwen/view/activity/ResumeActivity.kt +++ b/app/src/main/java/com/novel/qingwen/view/activity/ResumeActivity.kt @@ -1,13 +1,15 @@ package com.novel.qingwen.view.activity -import android.content.Context import android.content.Intent import android.graphics.Color import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.* +import android.widget.ImageView import androidx.activity.viewModels +import androidx.core.app.ActivityOptionsCompat import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment import com.novel.qingwen.R import com.novel.qingwen.base.IBaseView import com.novel.qingwen.databinding.ActivityResumeBinding @@ -31,12 +33,17 @@ class ResumeActivity : AppCompatActivity(), IBaseView { private val dialog: NoticeDialog by lazy { NoticeDialog.build(this, "请稍候") } companion object { - fun start(context: Context, id: Long, name: String) { - val intent = Intent(context, ResumeActivity::class.java) + fun start(context: Fragment, id: Long, name: String,view:View) { + val intent = Intent(context.requireContext(), ResumeActivity::class.java) intent.putExtra("id", id) BookShelfListUtil.currentBookInfo + val bundle = ActivityOptionsCompat.makeSceneTransitionAnimation( + context.requireActivity(), + view, + "novelPic" + ).toBundle() intent.putExtra("name", name) - context.startActivity(intent) + context.startActivity(intent,bundle) } } @@ -130,7 +137,8 @@ class ResumeActivity : AppCompatActivity(), IBaseView { when (item.itemId) { android.R.id.home -> { //返回按钮 - finish() +// finish() + onBackPressed() } R.id.addToBookShelf -> { if(!BookShelfListUtil.getList().contains(BookShelfListUtil.currentBookInfo)){ diff --git a/app/src/main/java/com/novel/qingwen/view/adapter/BookShelfListAdapter.kt b/app/src/main/java/com/novel/qingwen/view/adapter/BookShelfListAdapter.kt index 0434ae7..b3b2ecb 100644 --- a/app/src/main/java/com/novel/qingwen/view/adapter/BookShelfListAdapter.kt +++ b/app/src/main/java/com/novel/qingwen/view/adapter/BookShelfListAdapter.kt @@ -126,7 +126,7 @@ class BookShelfListAdapter( override fun getItemCount(): Int = values.size class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - val img: ImageView = view.findViewById(R.id.img) + val img: ImageView = view.findViewById(R.id.novelImg) val title: TextView = view.findViewById(R.id.title) val update: TextView = view.findViewById(R.id.update) diff --git a/app/src/main/java/com/novel/qingwen/view/adapter/BookStoreListAdapter.kt b/app/src/main/java/com/novel/qingwen/view/adapter/BookStoreListAdapter.kt index a8104ca..a9f9603 100644 --- a/app/src/main/java/com/novel/qingwen/view/adapter/BookStoreListAdapter.kt +++ b/app/src/main/java/com/novel/qingwen/view/adapter/BookStoreListAdapter.kt @@ -10,14 +10,13 @@ import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.novel.qingwen.R import com.novel.qingwen.net.bean.Book -import com.novel.qingwen.view.activity.ResumeActivity -class BookStoreListAdapter(private val list: ArrayList) : +class BookStoreListAdapter(private val list: ArrayList,private val block:(item:Book,view:View)->Unit) : RecyclerView.Adapter() { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val title: TextView = view.findViewById(R.id.title) - val img: ImageView = view.findViewById(R.id.img) + val img: ImageView = view.findViewById(R.id.novelImg) val author: TextView = view.findViewById(R.id.author) val resume: TextView = view.findViewById(R.id.resume) val tags: LinearLayout = view.findViewById(R.id.tags) @@ -49,7 +48,8 @@ class BookStoreListAdapter(private val list: ArrayList) : holder.vote.text = list[position].Score.toString() holder.itemView.setOnClickListener { - ResumeActivity.start(holder.itemView.context, item.Id.toLong(), item.Name) + block.invoke(item,holder.img) +// ResumeActivity.start(holder.itemView.context, item.Id.toLong(), item.Name) } } } \ No newline at end of file diff --git a/app/src/main/java/com/novel/qingwen/view/adapter/BookStoreRefreshHeader.kt b/app/src/main/java/com/novel/qingwen/view/adapter/BookStoreRefreshHeader.kt index 0f4a5bf..43e0f87 100644 --- a/app/src/main/java/com/novel/qingwen/view/adapter/BookStoreRefreshHeader.kt +++ b/app/src/main/java/com/novel/qingwen/view/adapter/BookStoreRefreshHeader.kt @@ -12,7 +12,7 @@ import sl.view.elasticviewlibrary.ElasticLayout class BookStoreRefreshHeader(private val context: Context, offset: Int) : ElasticLayout.HeaderAdapter(offset) { private lateinit var view: View - private val icon by lazy { view.findViewById(R.id.img) } + private val icon by lazy { view.findViewById(R.id.novelImg) } private val progressBar by lazy { view.findViewById(R.id.progressBar) } private val text by lazy { view.findViewById(R.id.text) } diff --git a/app/src/main/java/com/novel/qingwen/view/adapter/PageScrollController.kt b/app/src/main/java/com/novel/qingwen/view/adapter/PageScrollController.kt index 5fbc41d..1c3a286 100644 --- a/app/src/main/java/com/novel/qingwen/view/adapter/PageScrollController.kt +++ b/app/src/main/java/com/novel/qingwen/view/adapter/PageScrollController.kt @@ -29,11 +29,13 @@ object PageScrollController { if (view == null) return@launch view?.post { view?.scrollBy(0, 2) + //发送已经停止滑动的消息,让自动加载下一章的监听生效 +// view?.scrollTo(0,2) +// view?.setScrollState(RecyclerView.SCROLL_STATE_IDLE) +// view?.dispatchOnScrollStateChanged(RecyclerView.SCROLL_STATE_IDLE) +// view?.onScrollStateChanged(RecyclerView.SCROLL_STATE_IDLE) } -// val time = (32 * ((200f - v) / 200f)).toLong() val time = ((100 - v) / 2).toLong() -// Log.e("Time", time.toString()) -// delay((32 * ((200 - v) / 200)).toLong()) delay(5 + time) } diff --git a/app/src/main/java/com/novel/qingwen/view/adapter/SearchBookListAdapter.kt b/app/src/main/java/com/novel/qingwen/view/adapter/SearchBookListAdapter.kt index c6279f9..8e64a9e 100644 --- a/app/src/main/java/com/novel/qingwen/view/adapter/SearchBookListAdapter.kt +++ b/app/src/main/java/com/novel/qingwen/view/adapter/SearchBookListAdapter.kt @@ -10,14 +10,13 @@ import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.novel.qingwen.R import com.novel.qingwen.net.bean.SearchResultItem -import com.novel.qingwen.view.activity.ResumeActivity -class SearchBookListAdapter(private val list: ArrayList) : +class SearchBookListAdapter(private val list: ArrayList,private val block:(item:SearchResultItem,view:View)->Unit) : RecyclerView.Adapter() { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val title: TextView = view.findViewById(R.id.title) - val img: ImageView = view.findViewById(R.id.img) + val img: ImageView = view.findViewById(R.id.novelImg) val author: TextView = view.findViewById(R.id.author) val resume: TextView = view.findViewById(R.id.resume) val tags: LinearLayout = view.findViewById(R.id.tags) @@ -46,7 +45,8 @@ class SearchBookListAdapter(private val list: ArrayList) : holder.tags.removeAllViews() holder.tags.addView(view) holder.itemView.setOnClickListener { - ResumeActivity.start(holder.itemView.context, item.Id.toLong(), item.Name) + block.invoke(item,holder.img) +// ResumeActivity.start(holder.itemView.context, item.Id.toLong(), item.Name) } } } \ No newline at end of file diff --git a/app/src/main/java/com/novel/qingwen/view/fragment/BookStore.kt b/app/src/main/java/com/novel/qingwen/view/fragment/BookStore.kt index 232e337..17fb28c 100644 --- a/app/src/main/java/com/novel/qingwen/view/fragment/BookStore.kt +++ b/app/src/main/java/com/novel/qingwen/view/fragment/BookStore.kt @@ -16,9 +16,11 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.novel.qingwen.R import com.novel.qingwen.base.IBaseView +import com.novel.qingwen.view.activity.ResumeActivity import com.novel.qingwen.view.adapter.BookStoreCategoryAdapter import com.novel.qingwen.view.adapter.BookStoreListAdapter import com.novel.qingwen.view.dialog.NoticeDialog +import com.novel.qingwen.view.widget.CenterLayoutManager import com.novel.qingwen.viewmodel.BookStoreVM import kotlinx.android.synthetic.main.fragment_book_store.* import kotlinx.coroutines.Dispatchers @@ -64,6 +66,7 @@ class BookStore : Fragment(), IBaseView { private fun init() { val temp = arrayListOf("玄幻", "武侠", "都市", "历史", "科幻", "网游", "女生", "同人") + val categoryManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) val categoryAdapter = BookStoreCategoryAdapter( R.layout.fragment_book_store_item, temp @@ -84,7 +87,6 @@ class BookStore : Fragment(), IBaseView { } getContent() } - val categoryManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) categoryList.adapter = categoryAdapter categoryList.layoutManager = categoryManager categoryList.addOnScrollListener(object : RecyclerView.OnScrollListener() { @@ -154,7 +156,10 @@ class BookStore : Fragment(), IBaseView { val manager = LinearLayoutManager(context) bookStoreList.layoutManager = manager - bookStoreAdapter = BookStoreListAdapter(viewModel.getList()) + bookStoreAdapter = BookStoreListAdapter(viewModel.getList()){ + item,view-> + ResumeActivity.start(this,item.Id.toLong(),item.Name,view) + } bookStoreList.adapter = bookStoreAdapter bookStoreList.addItemDecoration( DividerItemDecoration( diff --git a/app/src/main/java/com/novel/qingwen/view/fragment/SearchBook.kt b/app/src/main/java/com/novel/qingwen/view/fragment/SearchBook.kt index f7dc3bb..fc49786 100644 --- a/app/src/main/java/com/novel/qingwen/view/fragment/SearchBook.kt +++ b/app/src/main/java/com/novel/qingwen/view/fragment/SearchBook.kt @@ -25,6 +25,7 @@ import com.novel.qingwen.view.adapter.SearchBookListAdapter import com.novel.qingwen.view.dialog.NoticeDialog import com.novel.qingwen.viewmodel.SearchVM import com.novel.qingwen.utils.Show +import com.novel.qingwen.view.activity.ResumeActivity import kotlinx.android.synthetic.main.fragment_search_book.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope @@ -78,7 +79,10 @@ class SearchBook : Fragment(), IBaseView, TextView.OnEditorActionListener, View. } }) closeBtn.setOnClickListener(this) - adapter = SearchBookListAdapter(viewModel.getList()) + adapter = SearchBookListAdapter(viewModel.getList()){ + item,view-> + ResumeActivity.start(this,item.Id.toLong(),item.Name,view) + } val manager = LinearLayoutManager(context) searchListView.adapter = adapter searchListView.layoutManager = manager @@ -106,8 +110,9 @@ class SearchBook : Fragment(), IBaseView, TextView.OnEditorActionListener, View. override fun showMsg(msg: String) { GlobalScope.launch(Dispatchers.Main) { - searchListView.visibility = if(viewModel.getList().size == 0)View.GONE else View.VISIBLE - tips.visibility = if(viewModel.getList().size == 0)View.VISIBLE else View.GONE + searchListView.visibility = + if (viewModel.getList().size == 0) View.GONE else View.VISIBLE + tips.visibility = if (viewModel.getList().size == 0) View.VISIBLE else View.GONE Toast.makeText(context, msg, Toast.LENGTH_SHORT).show() if (dialog.isShowing) dialog.dismiss() @@ -116,8 +121,9 @@ class SearchBook : Fragment(), IBaseView, TextView.OnEditorActionListener, View. override fun onComplete(target: Int) { GlobalScope.launch(Dispatchers.Main) { - searchListView.visibility = if(viewModel.getList().size == 0)View.GONE else View.VISIBLE - tips.visibility = if(viewModel.getList().size == 0)View.VISIBLE else View.GONE + searchListView.visibility = + if (viewModel.getList().size == 0) View.GONE else View.VISIBLE + tips.visibility = if (viewModel.getList().size == 0) View.VISIBLE else View.GONE adapter.notifyDataSetChanged() if (dialog.isShowing) dialog.dismiss() diff --git a/app/src/main/res/layout/activity_resume.xml b/app/src/main/res/layout/activity_resume.xml index 2c6e9ac..bd0c2e8 100644 --- a/app/src/main/res/layout/activity_resume.xml +++ b/app/src/main/res/layout/activity_resume.xml @@ -48,6 +48,7 @@ android:layout_height="120dp" android:layout_alignTop="@id/resumeBg" android:layout_marginStart="10dp" + android:transitionName="novelPic" android:layout_marginTop="90dp" android:background="@android:color/white" android:scaleType="fitXY" diff --git a/app/src/main/res/layout/fragment_book_shelf.xml b/app/src/main/res/layout/fragment_book_shelf.xml index 9a1b9d7..557be52 100644 --- a/app/src/main/res/layout/fragment_book_shelf.xml +++ b/app/src/main/res/layout/fragment_book_shelf.xml @@ -5,7 +5,7 @@ android:id="@+id/bottomBookShelf" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?attr/backgroundColor"> + android:background="@android:color/transparent">