commit
44fd594a2f
@ -1,67 +1,57 @@ |
||||
package io.legado.app.ui.widget |
||||
|
||||
import android.annotation.SuppressLint |
||||
import android.content.Context |
||||
import android.graphics.Canvas |
||||
import android.graphics.Paint |
||||
import android.graphics.Rect |
||||
import android.graphics.Typeface |
||||
import android.text.StaticLayout |
||||
import android.text.TextPaint |
||||
import android.util.AttributeSet |
||||
import android.view.View |
||||
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.getCompatColor |
||||
import io.legado.app.utils.sp |
||||
|
||||
class BatteryView(context: Context, attrs: AttributeSet?) : View(context, attrs) { |
||||
private var battery = 100 |
||||
private val textPaint = TextPaint() |
||||
private var batteryHeight: Int = 0 |
||||
private var batteryWidth: Int = 0 |
||||
class BatteryView(context: Context, attrs: AttributeSet?) : AppCompatTextView(context, attrs) { |
||||
private val batteryPaint = Paint() |
||||
private val outFrame = Rect() |
||||
private val polar = Rect() |
||||
|
||||
init { |
||||
textPaint.textSize = 10.sp.toFloat() |
||||
textPaint.strokeWidth = 1.dp.toFloat() |
||||
textPaint.isAntiAlias = true |
||||
textPaint.textAlign = Paint.Align.CENTER |
||||
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) |
||||
) |
||||
setPadding(4.dp, 0, 6.dp, 0) |
||||
batteryPaint.strokeWidth = 1.dp.toFloat() |
||||
batteryPaint.isAntiAlias = true |
||||
batteryPaint.color = paint.color |
||||
} |
||||
|
||||
fun setColor(@ColorInt color: Int) { |
||||
textPaint.color = color |
||||
setTextColor(color) |
||||
batteryPaint.color = color |
||||
invalidate() |
||||
} |
||||
|
||||
@SuppressLint("SetTextI18n") |
||||
fun setBattery(battery: Int) { |
||||
this.battery = battery |
||||
invalidate() |
||||
text = "$battery" |
||||
} |
||||
|
||||
override fun onDraw(canvas: Canvas) { |
||||
super.onDraw(canvas) |
||||
textPaint.style = Paint.Style.STROKE |
||||
canvas.drawRect(outFrame, textPaint) |
||||
textPaint.style = Paint.Style.FILL |
||||
canvas.drawRect(polar, textPaint) |
||||
val text = battery.toString() |
||||
val baseHeight = batteryHeight - textPaint.fontMetrics.descent |
||||
canvas.drawText(text, outFrame.right / 2.toFloat(), baseHeight, textPaint) |
||||
outFrame.set( |
||||
1.dp, |
||||
layout.getLineTop(0) + 2.dp, |
||||
width - 3.dp, |
||||
layout.getLineBottom(0) - 2.dp |
||||
) |
||||
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