pull/32/head
Administrator 5 years ago
parent e344fe9fb6
commit 5fc1808f29
  1. 2
      app/src/main/java/io/legado/app/ui/booksource/BookSourceActivity.kt
  2. 1
      app/src/main/java/io/legado/app/ui/chapterlist/ChapterListActivity.kt
  3. 12
      app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt
  4. 3
      app/src/main/java/io/legado/app/ui/search/SearchActivity.kt
  5. 2
      app/src/main/java/io/legado/app/ui/sourcedebug/SourceDebugActivity.kt
  6. 8
      app/src/main/java/io/legado/app/ui/widget/TitleBar.kt
  7. 97
      app/src/main/java/io/legado/app/ui/widget/page/PageView.kt
  8. 2
      app/src/main/java/io/legado/app/utils/ViewExtensions.kt
  9. 3
      app/src/main/res/layout/activity_book_source.xml
  10. 4
      app/src/main/res/layout/activity_chapter_list.xml
  11. 1
      app/src/main/res/layout/activity_search.xml
  12. 1
      app/src/main/res/layout/activity_source_debug.xml
  13. 3
      app/src/main/res/layout/view_book_page.xml
  14. 10
      app/src/main/res/layout/view_search.xml
  15. 7
      app/src/main/res/layout/view_tab_layout.xml
  16. 18
      app/src/main/res/layout/view_title_bar.xml
  17. 1
      app/src/main/res/values/attrs.xml

@ -23,6 +23,7 @@ import io.legado.app.ui.qrcode.QrCodeActivity
import io.legado.app.ui.sourceedit.SourceEditActivity import io.legado.app.ui.sourceedit.SourceEditActivity
import io.legado.app.utils.getViewModel import io.legado.app.utils.getViewModel
import kotlinx.android.synthetic.main.activity_book_source.* import kotlinx.android.synthetic.main.activity_book_source.*
import kotlinx.android.synthetic.main.view_search.*
import kotlinx.android.synthetic.main.view_title_bar.* import kotlinx.android.synthetic.main.view_title_bar.*
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -93,7 +94,6 @@ class BookSourceActivity : VMBaseActivity<BookSourceViewModel>(R.layout.activity
} }
private fun initSearchView() { private fun initSearchView() {
search_view.visibility = View.VISIBLE
search_view.onActionViewExpanded() search_view.onActionViewExpanded()
search_view.queryHint = getString(R.string.search_book_source) search_view.queryHint = getString(R.string.search_book_source)
search_view.clearFocus() search_view.clearFocus()

@ -12,6 +12,7 @@ import io.legado.app.base.BaseActivity
import io.legado.app.utils.gone import io.legado.app.utils.gone
import io.legado.app.utils.visible import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.activity_chapter_list.* import kotlinx.android.synthetic.main.activity_chapter_list.*
import kotlinx.android.synthetic.main.view_tab_layout.*
import kotlinx.android.synthetic.main.view_title_bar.* import kotlinx.android.synthetic.main.view_title_bar.*
class ChapterListActivity : BaseActivity(R.layout.activity_chapter_list) { class ChapterListActivity : BaseActivity(R.layout.activity_chapter_list) {

@ -29,6 +29,7 @@ import io.legado.app.ui.search.SearchActivity
import io.legado.app.utils.* import io.legado.app.utils.*
import kotlinx.android.synthetic.main.dialog_edittext.view.* import kotlinx.android.synthetic.main.dialog_edittext.view.*
import kotlinx.android.synthetic.main.fragment_bookshelf.* import kotlinx.android.synthetic.main.fragment_bookshelf.*
import kotlinx.android.synthetic.main.view_search.*
import kotlinx.android.synthetic.main.view_title_bar.* import kotlinx.android.synthetic.main.view_title_bar.*
import org.jetbrains.anko.startActivity import org.jetbrains.anko.startActivity
import org.jetbrains.anko.textColor import org.jetbrains.anko.textColor
@ -66,12 +67,11 @@ class BookshelfFragment : VMBaseFragment<BookshelfViewModel>(R.layout.fragment_b
} }
private fun initSearchView() { private fun initSearchView() {
search_view.visible() // search_view.onActionViewExpanded()
search_view.onActionViewExpanded() // search_view.isSubmitButtonEnabled = true
search_view.isSubmitButtonEnabled = true // search_view.queryHint = getString(R.string.search_book_key)
search_view.queryHint = getString(R.string.search_book_key) // search_view.clearFocus()
search_view.clearFocus() // search_view.setOnQueryTextListener(this)
search_view.setOnQueryTextListener(this)
} }
private fun initRecyclerView() { private fun initRecyclerView() {

@ -15,7 +15,7 @@ import io.legado.app.data.entities.SearchShow
import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.ATH
import io.legado.app.utils.getViewModel import io.legado.app.utils.getViewModel
import kotlinx.android.synthetic.main.activity_search.* import kotlinx.android.synthetic.main.activity_search.*
import kotlinx.android.synthetic.main.view_title_bar.* import kotlinx.android.synthetic.main.view_search.*
class SearchActivity : VMBaseActivity<SearchViewModel>(R.layout.activity_search) { class SearchActivity : VMBaseActivity<SearchViewModel>(R.layout.activity_search) {
@ -32,7 +32,6 @@ class SearchActivity : VMBaseActivity<SearchViewModel>(R.layout.activity_search)
} }
private fun initSearchView() { private fun initSearchView() {
search_view.visibility = View.VISIBLE
search_view.onActionViewExpanded() search_view.onActionViewExpanded()
search_view.isSubmitButtonEnabled = true search_view.isSubmitButtonEnabled = true
search_view.queryHint = getString(R.string.search_book_key) search_view.queryHint = getString(R.string.search_book_key)

@ -14,6 +14,7 @@ import io.legado.app.lib.theme.accentColor
import io.legado.app.ui.qrcode.QrCodeActivity import io.legado.app.ui.qrcode.QrCodeActivity
import io.legado.app.utils.getViewModel import io.legado.app.utils.getViewModel
import kotlinx.android.synthetic.main.activity_source_debug.* import kotlinx.android.synthetic.main.activity_source_debug.*
import kotlinx.android.synthetic.main.view_search.*
import kotlinx.android.synthetic.main.view_title_bar.* import kotlinx.android.synthetic.main.view_title_bar.*
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.jetbrains.anko.startActivityForResult import org.jetbrains.anko.startActivityForResult
@ -50,7 +51,6 @@ class SourceDebugActivity : VMBaseActivity<SourceDebugModel>(R.layout.activity_s
} }
private fun initSearchView() { private fun initSearchView() {
search_view.visibility = View.VISIBLE
search_view.onActionViewExpanded() search_view.onActionViewExpanded()
search_view.isSubmitButtonEnabled = true search_view.isSubmitButtonEnabled = true
search_view.queryHint = getString(R.string.search_book_key) search_view.queryHint = getString(R.string.search_book_key)

@ -10,7 +10,6 @@ import android.view.Menu
import android.view.View import android.view.View
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.annotation.StyleRes import androidx.annotation.StyleRes
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout
@ -126,6 +125,9 @@ class TitleBar(context: Context, attrs: AttributeSet?) : AppBarLayout(context, a
this.subtitle = subtitleText this.subtitle = subtitleText
} }
if (a.hasValue(R.styleable.TitleBar_contentLayout)) {
inflate(context, a.getResourceId(R.styleable.TitleBar_contentLayout, 0), this)
}
} }
if (a.getBoolean(R.styleable.TitleBar_fitStatusBar, true)) { if (a.getBoolean(R.styleable.TitleBar_fitStatusBar, true)) {
@ -146,7 +148,7 @@ class TitleBar(context: Context, attrs: AttributeSet?) : AppBarLayout(context, a
if (attachToActivity) { if (attachToActivity) {
attachToActivity() attachToActivity()
} }
wrapAppTheme() wrapTheme()
} }
fun setNavigationOnClickListener(clickListener: ((View) -> Unit)) { fun setNavigationOnClickListener(clickListener: ((View) -> Unit)) {
@ -177,7 +179,7 @@ class TitleBar(context: Context, attrs: AttributeSet?) : AppBarLayout(context, a
toolbar.setSubtitleTextAppearance(context, resId) toolbar.setSubtitleTextAppearance(context, resId)
} }
private fun wrapAppTheme() { private fun wrapTheme() {
val primaryTextColor = if (isInEditMode) Color.BLACK else context.primaryTextColor val primaryTextColor = if (isInEditMode) Color.BLACK else context.primaryTextColor
DrawableUtils.setTint(toolbar.overflowIcon, primaryTextColor) DrawableUtils.setTint(toolbar.overflowIcon, primaryTextColor)
toolbar.setTitleTextColor(primaryTextColor) toolbar.setTitleTextColor(primaryTextColor)

@ -1,19 +1,17 @@
package io.legado.app.ui.widget.page package io.legado.app.ui.widget.page
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.*
import android.graphics.Canvas
import android.graphics.Rect
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
import android.util.AttributeSet import android.util.AttributeSet
import android.util.Log
import android.view.MotionEvent import android.view.MotionEvent
import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.appcompat.widget.AppCompatTextView
import io.legado.app.R import io.legado.app.R
import io.legado.app.utils.dp
import io.legado.app.utils.screenshot import io.legado.app.utils.screenshot
import kotlin.math.abs import kotlinx.android.synthetic.main.view_book_page.view.*
import org.jetbrains.anko.backgroundColor
import org.jetbrains.anko.horizontalPadding
class PageView(context: Context, attrs: AttributeSet) : FrameLayout(context, attrs) { class PageView(context: Context, attrs: AttributeSet) : FrameLayout(context, attrs) {
@ -22,33 +20,98 @@ class PageView(context: Context, attrs: AttributeSet) : FrameLayout(context, att
private var downX: Float = 0.toFloat() private var downX: Float = 0.toFloat()
private var offset: Float = 0.toFloat() private var offset: Float = 0.toFloat()
private val srcRect: Rect = Rect() private val shadowDrawableR: GradientDrawable
private val destRect: Rect = Rect() private val shadowDrawableL: GradientDrawable
private val shadowDrawable: GradientDrawable
private val bitmapMatrix = Matrix()
private var cover: Boolean = true
init { init {
val shadowColors = intArrayOf(0x66111111, 0x00000000) val shadowColors = intArrayOf(0x66111111, 0x00000000)
shadowDrawable = GradientDrawable( shadowDrawableR = GradientDrawable(
GradientDrawable.Orientation.LEFT_RIGHT, shadowColors GradientDrawable.Orientation.LEFT_RIGHT, shadowColors
) )
shadowDrawable.gradientType = GradientDrawable.LINEAR_GRADIENT shadowDrawableR.gradientType = GradientDrawable.LINEAR_GRADIENT
shadowDrawableL = GradientDrawable(
GradientDrawable.Orientation.RIGHT_LEFT, shadowColors
)
shadowDrawableL.gradientType = GradientDrawable.LINEAR_GRADIENT
inflate(context, R.layout.view_book_page, this)
setWillNotDraw(false)
page_panel.backgroundColor = Color.WHITE
page_panel.horizontalPadding = 16.dp
inflate(context, R.layout.page_view, this)
} }
override fun onDraw(canvas: Canvas?) { override fun dispatchDraw(canvas: Canvas?) {
canvas?.save() super.dispatchDraw(canvas)
super.onDraw(canvas)
canvas?.restore() bitmap?.let {
val dx = if (offset > 0) offset - width else offset + width
bitmapMatrix.setTranslate(dx, 0.toFloat())
canvas?.drawBitmap(it, bitmapMatrix, null)
if (cover) {
addShadow(dx.toInt(), canvas)
}
}
}
private fun addShadow(left: Int, canvas: Canvas?) {
canvas?.let {
if (left < 0) {
shadowDrawableR.setBounds(left + width, 0, left+ width + 30, height)
shadowDrawableR.draw(it)
} else {
shadowDrawableL.setBounds(left - 30, 0, left, height)
shadowDrawableL.draw(it)
}
}
} }
override fun onTouchEvent(event: MotionEvent?): Boolean { override fun onTouchEvent(event: MotionEvent?): Boolean {
when (event?.action) {
MotionEvent.ACTION_DOWN -> {
bitmap = page_panel.screenshot()
downX = event.x
offset = 0.toFloat()
if (!cover) {
page_panel.translationX = 0.toFloat()
}
invalidate()
}
MotionEvent.ACTION_MOVE -> {
offset = event.x - downX
if (!cover) {
page_panel.translationX = offset
}
invalidate()
}
MotionEvent.ACTION_UP -> {
bitmap = null
if (!cover) {
page_panel.translationX = 0.toFloat()
}
invalidate()
}
}
return true return true
} }
fun setTranslate(translationX: Float, translationY: Float) {
page_panel.translationX = translationX
page_panel.translationY = translationY
}
fun setPageFactory(factory: PageFactory<*>) { fun setPageFactory(factory: PageFactory<*>) {
} }

@ -28,7 +28,7 @@ private tailrec fun getCompatActivity(context: Context?): AppCompatActivity? {
val View.activity: AppCompatActivity? val View.activity: AppCompatActivity?
get() = getCompatActivity(context) get() = getCompatActivity(context)
fun View.hideSoftInput() = run { inline fun View.hideSoftInput() = run {
val imm = App.INSTANCE.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager val imm = App.INSTANCE.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
imm?.let { imm?.let {
imm.hideSoftInputFromWindow(this.windowToken, 0) imm.hideSoftInputFromWindow(this.windowToken, 0)

@ -11,7 +11,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:contentInsetStartWithNavigation="0dp" app:contentInsetStartWithNavigation="0dp"
app:displayHomeAsUp="true" app:displayHomeAsUp="true"
app:title="@string/book_source"/> app:title="@string/book_source"
app:contentLayout="@layout/view_search"/>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -7,7 +8,8 @@
<io.legado.app.ui.widget.TitleBar <io.legado.app.ui.widget.TitleBar
android:id="@+id/title_bar" android:id="@+id/title_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
app:contentLayout="@layout/view_tab_layout"/>
<androidx.viewpager.widget.ViewPager <androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager" android:id="@+id/view_pager"

@ -11,6 +11,7 @@
android:id="@+id/title_bar" android:id="@+id/title_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:contentLayout="@layout/view_search"
app:contentInsetStartWithNavigation="0dp" app:contentInsetStartWithNavigation="0dp"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:title="搜索"/> app:title="搜索"/>

@ -10,6 +10,7 @@
android:id="@+id/title_bar" android:id="@+id/title_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:contentLayout="@layout/view_search"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:title="@string/debug_source" /> app:title="@string/debug_source" />

@ -24,7 +24,8 @@
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/text_view" android:id="@+id/text_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"/> android:layout_height="match_parent"
android:text="233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333233333333333333333333333333333333333333333333333333"/>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.SearchView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/search_view"
android:layout_width="match_parent"
android:theme="?attr/actionBarStyle"
android:layout_height="wrap_content"
android:imeOptions="actionSearch"
app:defaultQueryHint="搜索"/>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.tabs.TabLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:theme="?attr/actionBarStyle"/>

@ -5,20 +5,4 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="?attr/actionBarStyle" android:theme="?attr/actionBarStyle"
app:popupTheme="@style/AppTheme.PopupOverlay"> app:popupTheme="@style/AppTheme.PopupOverlay"/>
<androidx.appcompat.widget.SearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:imeOptions="actionSearch"
app:defaultQueryHint="搜索" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
</androidx.appcompat.widget.Toolbar>

@ -14,6 +14,7 @@
<attr name="contentInsetStartWithNavigation"/> <attr name="contentInsetStartWithNavigation"/>
<attr name="contentInsetLeft"/> <attr name="contentInsetLeft"/>
<attr name="contentInsetRight"/> <attr name="contentInsetRight"/>
<attr name="contentLayout" format="reference"/>
<attr name="attachToActivity" format="boolean"/> <attr name="attachToActivity" format="boolean"/>
<attr name="displayHomeAsUp" format="boolean"/> <attr name="displayHomeAsUp" format="boolean"/>
<attr name="navigationIcon" format="reference"/> <attr name="navigationIcon" format="reference"/>

Loading…
Cancel
Save