commit
44fd594a2f
@ -1,67 +1,57 @@ |
|||||||
package io.legado.app.ui.widget |
package io.legado.app.ui.widget |
||||||
|
|
||||||
|
import android.annotation.SuppressLint |
||||||
import android.content.Context |
import android.content.Context |
||||||
import android.graphics.Canvas |
import android.graphics.Canvas |
||||||
import android.graphics.Paint |
import android.graphics.Paint |
||||||
import android.graphics.Rect |
import android.graphics.Rect |
||||||
import android.graphics.Typeface |
|
||||||
import android.text.StaticLayout |
|
||||||
import android.text.TextPaint |
|
||||||
import android.util.AttributeSet |
import android.util.AttributeSet |
||||||
import android.view.View |
|
||||||
import androidx.annotation.ColorInt |
import androidx.annotation.ColorInt |
||||||
import io.legado.app.R |
import androidx.appcompat.widget.AppCompatTextView |
||||||
import io.legado.app.utils.dp |
import io.legado.app.utils.dp |
||||||
import io.legado.app.utils.getCompatColor |
|
||||||
import io.legado.app.utils.sp |
|
||||||
|
|
||||||
class BatteryView(context: Context, attrs: AttributeSet?) : View(context, attrs) { |
class BatteryView(context: Context, attrs: AttributeSet?) : AppCompatTextView(context, attrs) { |
||||||
private var battery = 100 |
private val batteryPaint = Paint() |
||||||
private val textPaint = TextPaint() |
|
||||||
private var batteryHeight: Int = 0 |
|
||||||
private var batteryWidth: Int = 0 |
|
||||||
private val outFrame = Rect() |
private val outFrame = Rect() |
||||||
private val polar = Rect() |
private val polar = Rect() |
||||||
|
|
||||||
init { |
init { |
||||||
textPaint.textSize = 10.sp.toFloat() |
setPadding(4.dp, 0, 6.dp, 0) |
||||||
textPaint.strokeWidth = 1.dp.toFloat() |
batteryPaint.strokeWidth = 1.dp.toFloat() |
||||||
textPaint.isAntiAlias = true |
batteryPaint.isAntiAlias = true |
||||||
textPaint.textAlign = Paint.Align.CENTER |
batteryPaint.color = paint.color |
||||||
textPaint.color = context.getCompatColor(R.color.tv_text_default) |
|
||||||
textPaint.typeface = Typeface.createFromAsset(context.assets, "number.ttf") |
|
||||||
batteryHeight = with(textPaint.fontMetrics) { descent - ascent + leading }.toInt() |
|
||||||
batteryWidth = StaticLayout.getDesiredWidth("100", textPaint).toInt() + 10.dp |
|
||||||
outFrame.set(1.dp, 1.dp, batteryWidth - 3.dp, batteryHeight - 1.dp) |
|
||||||
polar.set(outFrame.right, batteryHeight / 3, batteryWidth, batteryHeight * 2 / 3) |
|
||||||
} |
|
||||||
|
|
||||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { |
|
||||||
super.onMeasure( |
|
||||||
MeasureSpec.makeMeasureSpec(batteryWidth, MeasureSpec.EXACTLY), |
|
||||||
MeasureSpec.makeMeasureSpec(batteryHeight, MeasureSpec.EXACTLY) |
|
||||||
) |
|
||||||
} |
} |
||||||
|
|
||||||
fun setColor(@ColorInt color: Int) { |
fun setColor(@ColorInt color: Int) { |
||||||
textPaint.color = color |
setTextColor(color) |
||||||
|
batteryPaint.color = color |
||||||
invalidate() |
invalidate() |
||||||
} |
} |
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n") |
||||||
fun setBattery(battery: Int) { |
fun setBattery(battery: Int) { |
||||||
this.battery = battery |
text = "$battery" |
||||||
invalidate() |
|
||||||
} |
} |
||||||
|
|
||||||
override fun onDraw(canvas: Canvas) { |
override fun onDraw(canvas: Canvas) { |
||||||
super.onDraw(canvas) |
super.onDraw(canvas) |
||||||
textPaint.style = Paint.Style.STROKE |
outFrame.set( |
||||||
canvas.drawRect(outFrame, textPaint) |
1.dp, |
||||||
textPaint.style = Paint.Style.FILL |
layout.getLineTop(0) + 2.dp, |
||||||
canvas.drawRect(polar, textPaint) |
width - 3.dp, |
||||||
val text = battery.toString() |
layout.getLineBottom(0) - 2.dp |
||||||
val baseHeight = batteryHeight - textPaint.fontMetrics.descent |
) |
||||||
canvas.drawText(text, outFrame.right / 2.toFloat(), baseHeight, textPaint) |
val dj = (outFrame.bottom - outFrame.top) / 3 |
||||||
|
polar.set( |
||||||
|
outFrame.right, |
||||||
|
outFrame.top + dj, |
||||||
|
width - 1.dp, |
||||||
|
outFrame.bottom - dj |
||||||
|
) |
||||||
|
batteryPaint.style = Paint.Style.STROKE |
||||||
|
canvas.drawRect(outFrame, batteryPaint) |
||||||
|
batteryPaint.style = Paint.Style.FILL |
||||||
|
canvas.drawRect(polar, batteryPaint) |
||||||
} |
} |
||||||
|
|
||||||
} |
} |
@ -0,0 +1,419 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto" |
||||||
|
xmlns:tools="http://schemas.android.com/tools" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent" |
||||||
|
android:orientation="vertical"> |
||||||
|
|
||||||
|
<ImageView |
||||||
|
android:id="@+id/bg_book" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent" |
||||||
|
android:scaleType="centerCrop" |
||||||
|
android:contentDescription="@string/bg_image" |
||||||
|
app:layout_constraintTop_toTopOf="parent" /> |
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar |
||||||
|
android:id="@+id/toolbar" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:theme="?attr/actionBarStyle" |
||||||
|
android:fitsSystemWindows="true" |
||||||
|
app:popupTheme="@style/AppTheme.PopupOverlay" |
||||||
|
app:layout_constraintTop_toTopOf="parent" |
||||||
|
app:title="@string/book_info" /> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:id="@+id/vw_bg" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent" |
||||||
|
android:background="#50000000" |
||||||
|
android:orientation="horizontal" |
||||||
|
android:fitsSystemWindows="true"> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent" |
||||||
|
android:layout_weight="1.0" |
||||||
|
android:layout_gravity="center" |
||||||
|
android:gravity="center" |
||||||
|
android:orientation="vertical"> |
||||||
|
|
||||||
|
<RelativeLayout |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginTop="68dp"> |
||||||
|
|
||||||
|
<io.legado.app.ui.widget.ArcView |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="78dp" |
||||||
|
android:layout_marginTop="120dp" |
||||||
|
app:arcDirectionTop="true" |
||||||
|
app:arcHeight="36dp" |
||||||
|
app:bgColor="@color/background" /> |
||||||
|
|
||||||
|
<androidx.cardview.widget.CardView |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_centerHorizontal="true" |
||||||
|
android:layout_margin="3dp" |
||||||
|
app:cardCornerRadius="5dp" |
||||||
|
app:cardElevation="8dp"> |
||||||
|
|
||||||
|
<io.legado.app.ui.widget.image.CoverImageView |
||||||
|
android:id="@+id/iv_cover" |
||||||
|
android:layout_width="130dp" |
||||||
|
android:layout_height="200dp" |
||||||
|
android:contentDescription="@string/img_cover" |
||||||
|
android:scaleType="centerCrop" |
||||||
|
android:src="@drawable/image_cover_default" /> |
||||||
|
|
||||||
|
</androidx.cardview.widget.CardView> |
||||||
|
|
||||||
|
</RelativeLayout> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent" |
||||||
|
android:background="@color/background" |
||||||
|
android:orientation="vertical" |
||||||
|
android:paddingLeft="10dp" |
||||||
|
android:paddingTop="8dp" |
||||||
|
android:paddingRight="16dp" |
||||||
|
android:paddingBottom="3dp"> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/tv_name" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginBottom="6dp" |
||||||
|
android:gravity="center" |
||||||
|
android:includeFontPadding="false" |
||||||
|
android:singleLine="true" |
||||||
|
android:text="@string/book_name" |
||||||
|
android:textColor="@color/tv_text_default" |
||||||
|
android:textSize="18sp" |
||||||
|
tools:ignore="RtlHardcoded" /> |
||||||
|
|
||||||
|
<io.legado.app.ui.widget.LabelsBar |
||||||
|
android:id="@+id/lb_kind" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_gravity="center" |
||||||
|
android:layout_marginBottom="6dp" |
||||||
|
android:gravity="center" |
||||||
|
android:visibility="gone" /> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="match_parent" |
||||||
|
android:gravity="center" |
||||||
|
android:layout_gravity="center" |
||||||
|
android:orientation="horizontal" |
||||||
|
android:paddingTop="3dp" |
||||||
|
android:paddingBottom="3dp"> |
||||||
|
|
||||||
|
<ImageView |
||||||
|
android:layout_width="18sp" |
||||||
|
android:layout_height="18sp" |
||||||
|
android:contentDescription="@string/origin_format" |
||||||
|
android:paddingRight="4dp" |
||||||
|
android:src="@drawable/ic_author" |
||||||
|
app:tint="@color/tv_text_summary" |
||||||
|
tools:ignore="RtlHardcoded,RtlSymmetry" /> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/tv_author" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:ellipsize="end" |
||||||
|
android:includeFontPadding="false" |
||||||
|
android:singleLine="true" |
||||||
|
android:text="@string/author" |
||||||
|
android:textColor="@color/tv_text_summary" |
||||||
|
android:textSize="13sp" |
||||||
|
tools:ignore="NestedWeights" /> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:layout_weight="1.0" |
||||||
|
android:orientation="vertical" |
||||||
|
android:layout_marginTop="65dp" |
||||||
|
android:layout_marginLeft="1px" |
||||||
|
android:fitsSystemWindows="true" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent"> |
||||||
|
|
||||||
|
<ScrollView |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_weight="1" |
||||||
|
android:background="@color/background" |
||||||
|
android:fillViewport="true" |
||||||
|
android:fitsSystemWindows="true" |
||||||
|
android:focusable="true" |
||||||
|
android:padding="0dp" |
||||||
|
android:scrollbarStyle="outsideInset" |
||||||
|
android:scrollbars="vertical"> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:orientation="vertical" |
||||||
|
android:paddingTop="16dp" |
||||||
|
android:paddingLeft="8dp" |
||||||
|
android:paddingRight="8dp" |
||||||
|
android:paddingBottom="8dp"> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:background="@color/background" |
||||||
|
android:orientation="vertical" |
||||||
|
android:paddingLeft="8dp" |
||||||
|
android:paddingRight="8dp" |
||||||
|
android:paddingBottom="8dp"> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:gravity="center_vertical" |
||||||
|
android:orientation="horizontal" |
||||||
|
android:paddingTop="3dp" |
||||||
|
android:paddingBottom="3dp"> |
||||||
|
|
||||||
|
<ImageView |
||||||
|
android:id="@+id/iv_web" |
||||||
|
android:layout_width="18sp" |
||||||
|
android:layout_height="18sp" |
||||||
|
android:contentDescription="@string/origin_format" |
||||||
|
android:paddingRight="2dp" |
||||||
|
android:src="@drawable/ic_web_outline" |
||||||
|
app:tint="@color/tv_text_summary" |
||||||
|
tools:ignore="RtlHardcoded,RtlSymmetry" /> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/tv_origin" |
||||||
|
android:layout_width="0dp" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_weight="1" |
||||||
|
android:ellipsize="end" |
||||||
|
android:includeFontPadding="false" |
||||||
|
android:paddingRight="6dp" |
||||||
|
android:singleLine="true" |
||||||
|
android:text="@string/origin_format" |
||||||
|
android:textColor="@color/tv_text_summary" |
||||||
|
android:textSize="13sp" |
||||||
|
tools:ignore="NestedWeights" /> |
||||||
|
|
||||||
|
<io.legado.app.ui.widget.text.AccentBgTextView |
||||||
|
android:id="@+id/tv_change_source" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginStart="8dp" |
||||||
|
android:paddingLeft="5dp" |
||||||
|
android:paddingRight="5dp" |
||||||
|
android:text="@string/change_origin" |
||||||
|
android:textSize="13sp" |
||||||
|
app:radius="2dp" /> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:gravity="center_vertical" |
||||||
|
android:orientation="horizontal" |
||||||
|
android:paddingTop="3dp" |
||||||
|
android:paddingBottom="3dp"> |
||||||
|
|
||||||
|
<ImageView |
||||||
|
android:id="@+id/ic_book_last" |
||||||
|
android:layout_width="18sp" |
||||||
|
android:layout_height="18sp" |
||||||
|
android:contentDescription="@string/read_dur_progress" |
||||||
|
android:paddingRight="2dp" |
||||||
|
android:src="@drawable/ic_book_last" |
||||||
|
app:tint="@color/tv_text_summary" |
||||||
|
tools:ignore="RtlHardcoded,RtlSymmetry" /> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/tv_lasted" |
||||||
|
android:layout_width="0dp" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_weight="1" |
||||||
|
android:ellipsize="end" |
||||||
|
android:includeFontPadding="false" |
||||||
|
android:paddingRight="6dp" |
||||||
|
android:singleLine="true" |
||||||
|
android:text="@string/read_dur_progress" |
||||||
|
android:textColor="@color/tv_text_summary" |
||||||
|
android:textSize="13sp" |
||||||
|
tools:ignore="NestedWeights" /> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:gravity="center_vertical" |
||||||
|
android:orientation="horizontal" |
||||||
|
android:paddingTop="3dp" |
||||||
|
android:paddingBottom="3dp"> |
||||||
|
|
||||||
|
<ImageView |
||||||
|
android:layout_width="18sp" |
||||||
|
android:layout_height="18sp" |
||||||
|
android:contentDescription="@string/read_dur_progress" |
||||||
|
android:paddingRight="2dp" |
||||||
|
android:src="@drawable/ic_groups" |
||||||
|
app:tint="@color/tv_text_summary" |
||||||
|
tools:ignore="RtlHardcoded,RtlSymmetry" /> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/tv_group" |
||||||
|
android:layout_width="0dp" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_weight="1" |
||||||
|
android:ellipsize="end" |
||||||
|
android:includeFontPadding="false" |
||||||
|
android:paddingRight="6dp" |
||||||
|
android:singleLine="true" |
||||||
|
android:text="@string/group_s" |
||||||
|
android:textColor="@color/tv_text_summary" |
||||||
|
android:textSize="13sp" |
||||||
|
tools:ignore="NestedWeights" /> |
||||||
|
|
||||||
|
<io.legado.app.ui.widget.text.AccentBgTextView |
||||||
|
android:id="@+id/tv_change_group" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginStart="8dp" |
||||||
|
android:paddingLeft="5dp" |
||||||
|
android:paddingRight="5dp" |
||||||
|
android:text="@string/change_group" |
||||||
|
android:textSize="13sp" |
||||||
|
app:radius="2dp" /> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:gravity="center_vertical" |
||||||
|
android:orientation="horizontal" |
||||||
|
android:paddingTop="3dp" |
||||||
|
android:paddingBottom="3dp"> |
||||||
|
|
||||||
|
<ImageView |
||||||
|
android:layout_width="18sp" |
||||||
|
android:layout_height="18sp" |
||||||
|
android:contentDescription="@string/read_dur_progress" |
||||||
|
android:paddingRight="2dp" |
||||||
|
android:src="@drawable/ic_folder_open" |
||||||
|
app:tint="@color/tv_text_summary" |
||||||
|
tools:ignore="RtlHardcoded,RtlSymmetry" /> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/tv_toc" |
||||||
|
android:layout_width="0dp" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_weight="1" |
||||||
|
android:ellipsize="end" |
||||||
|
android:includeFontPadding="false" |
||||||
|
android:paddingRight="6dp" |
||||||
|
android:singleLine="true" |
||||||
|
android:text="@string/toc_s" |
||||||
|
android:textColor="@color/tv_text_summary" |
||||||
|
android:textSize="13sp" |
||||||
|
tools:ignore="NestedWeights" /> |
||||||
|
|
||||||
|
<io.legado.app.ui.widget.text.AccentBgTextView |
||||||
|
android:id="@+id/tv_toc_view" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginStart="8dp" |
||||||
|
android:paddingLeft="5dp" |
||||||
|
android:paddingRight="5dp" |
||||||
|
android:text="@string/view_toc" |
||||||
|
android:textSize="13sp" |
||||||
|
app:radius="2dp" /> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
<io.legado.app.ui.widget.text.ScrollTextView |
||||||
|
android:id="@+id/tv_intro" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginTop="8dp" |
||||||
|
android:clickable="true" |
||||||
|
android:focusable="true" |
||||||
|
android:paddingLeft="8dp" |
||||||
|
android:paddingBottom="8dp" |
||||||
|
android:text="@string/book_intro" |
||||||
|
android:textColor="@color/tv_text_secondary" |
||||||
|
android:textSize="14sp" |
||||||
|
android:visibility="visible" /> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
</ScrollView> |
||||||
|
|
||||||
|
<View |
||||||
|
android:layout_marginBottom="1px" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="8dp" |
||||||
|
android:background="@color/background"></View> |
||||||
|
|
||||||
|
<LinearLayout |
||||||
|
android:id="@+id/fl_action" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="50dp" |
||||||
|
android:background="@color/background_menu" |
||||||
|
android:orientation="horizontal" |
||||||
|
app:layout_constraintBottom_toBottomOf="parent"> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/tv_shelf" |
||||||
|
android:layout_width="0dp" |
||||||
|
android:layout_height="match_parent" |
||||||
|
android:layout_weight="1" |
||||||
|
android:background="?attr/selectableItemBackground" |
||||||
|
android:clickable="true" |
||||||
|
android:focusable="true" |
||||||
|
android:gravity="center" |
||||||
|
android:includeFontPadding="false" |
||||||
|
android:text="@string/remove_from_bookshelf" |
||||||
|
android:textColor="@color/tv_text_default" |
||||||
|
android:textSize="15sp" /> |
||||||
|
|
||||||
|
<io.legado.app.ui.widget.text.AccentBgTextView |
||||||
|
android:id="@+id/tv_read" |
||||||
|
android:layout_width="0dp" |
||||||
|
android:layout_height="match_parent" |
||||||
|
android:layout_weight="1" |
||||||
|
android:background="@drawable/selector_btn_accent_bg" |
||||||
|
android:gravity="center" |
||||||
|
android:includeFontPadding="false" |
||||||
|
android:text="@string/reading" |
||||||
|
android:textColor="@color/tv_text_button_nor" |
||||||
|
android:textSize="15sp" /> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
|
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout> |
Loading…
Reference in new issue