diff --git a/VisualNovel/app/src/main/AndroidManifest.xml b/VisualNovel/app/src/main/AndroidManifest.xml index 3cc5eb7..0b6ae22 100644 --- a/VisualNovel/app/src/main/AndroidManifest.xml +++ b/VisualNovel/app/src/main/AndroidManifest.xml @@ -15,7 +15,6 @@ diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/app/BaseBindingQuickAdapter.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/app/BaseBindingQuickAdapter.kt new file mode 100644 index 0000000..b33f128 --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/app/BaseBindingQuickAdapter.kt @@ -0,0 +1,47 @@ +package com.remax.visualnovel.app + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.viewbinding.ViewBinding +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder + +/** + * Created by HJW on 2021/10/19 + */ +abstract class BaseBindingQuickAdapter( + private val inflate: (LayoutInflater, ViewGroup, Boolean) -> VB, + layoutResId: Int = -1, + data: MutableList? = null +) : + BaseQuickAdapter(layoutResId, data) { + + override fun onCreateDefViewHolder(parent: ViewGroup, viewType: Int) = + BaseBindingHolder(inflate(LayoutInflater.from(parent.context), parent, false)) + + class BaseBindingHolder(private val binding: ViewBinding) : BaseViewHolder(binding.root) { + constructor(itemView: View) : this(ViewBinding { itemView }) + + @Suppress("UNCHECKED_CAST") + fun getViewBinding() = binding as VB + + var extraObj: Any? = null + + } + + /** + * 带左右滑动的item收起 + */ +// fun resetDeleteView(position: Int) { +// try { +// (getViewByPosition( +// position + headerLayoutCount, +// R.id.easySwipeMenuLayout +// ) as? EasySwipeMenuLayout)?.resetStatus() +// } catch (e: Exception) { +// Timber.d("resetDeleteView position:$position Exception:${e.localizedMessage}") +// } +// } + +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorItem.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorItem.kt new file mode 100644 index 0000000..9915a89 --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorItem.kt @@ -0,0 +1,15 @@ +package com.remax.visualnovel.ui.main.actor + +data class ActorItem( + val id: Int, + val avatarRes: Int, + val from: String = "from", + val rating: Float, + val characterName: String, + val age: Int, + val tags: List, + val description: String, + val workTitle: String, + val imageRes: Int +) + diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorListFragment.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorListFragment.kt index be0574f..aeab5e3 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorListFragment.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorListFragment.kt @@ -1,26 +1,31 @@ package com.remax.visualnovel.ui.main.actor + import android.os.Bundle import android.util.Log import android.widget.Toast import androidx.fragment.app.viewModels +import androidx.recyclerview.widget.DefaultItemAnimator +import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.launcher.ARouter import com.dylanc.loadingstateview.BgColorType +import com.remax.visualnovel.R import com.remax.visualnovel.app.base.BaseBindingFragment +import com.remax.visualnovel.configs.NovelApplication import com.remax.visualnovel.databinding.FragmentMainActorBinding import com.remax.visualnovel.utils.Routers -import com.remax.visualnovel.widget.custom.AbsTagBean import dagger.hilt.android.AndroidEntryPoint import kotlin.getValue - +import kotlin.math.max @AndroidEntryPoint @Route(path = Routers.ROUTE_FRAG_ACTORLIST) class ActorListFragment : BaseBindingFragment() { - private val contactViewModel by viewModels() + private lateinit var actorAdapter: ActorsAdapter + private val actorsViewModel by viewModels() override fun onCreated(bundle: Bundle?) { setUI() @@ -32,15 +37,125 @@ class ActorListFragment : BaseBindingFragment() { private fun setUI() { initTagLayout() + initRecyclerView() with(binding) { tagFlowLayout } } + private fun initRecyclerView() { + with(binding) { + val layoutManager = LayoutManagerHelper.createAdaptiveStaggeredGridLayoutManager() + actorsRv.layoutManager = layoutManager + actorsRv.addItemDecoration(GridSpacingItemDecoration(16)) + actorsRv.setHasFixedSize(true) + actorsRv.itemAnimator = DefaultItemAnimator() + actorAdapter = ActorsAdapter() + actorsRv.adapter = actorAdapter + + val characterList = createSampleData() + actorAdapter.setList(characterList) + } + + + } + + private fun createSampleData(): List { + return listOf( + ActorItem( + id = 1, + avatarRes = R.drawable.avatar1, + rating = 9.5f, + characterName = "Lin Feng", + age = 18, + tags = listOf("#Xianxia", "#Swordsmanship", "#Cultivation"), + description = "glory through relentless effort and uncover the conspiracy that destroyed him.", + workTitle = "The Last Oracle of Kael", + imageRes = R.drawable.character1 + ), + ActorItem( + id = 2, + avatarRes = R.drawable.avatar2, + rating = 9.2f, + characterName = "Yue Ling", + age = 16, + tags = listOf("#Fantasy", "#Magic", "#Adventure"), + description = "A young mage with exceptional talent in elemental magic, on a journey to discover ancient magical artifacts.", + workTitle = "Elemental Chronicles", + imageRes = R.drawable.character2 + ), + ActorItem( + id = 1, + avatarRes = R.drawable.avatar1, + rating = 9.5f, + characterName = "Lin Feng", + age = 18, + tags = listOf("#Xianxia", "#Swordsmanship", "#Cultivation"), + description = "Once a prodigy, Lin Feng had his cultivation shattered and was cast out of his clan. Now he must reclaim his former glory through relentless effort and uncover the conspiracy that destroyed him.", + workTitle = "The Last Oracle of Kael", + imageRes = R.drawable.character1 + ), + ActorItem( + id = 2, + avatarRes = R.drawable.avatar2, + rating = 9.2f, + characterName = "Yue Ling", + age = 16, + tags = listOf("#Fantasy", "#Magic", "#Adventure"), + description = "magical artifacts.", + workTitle = "Elemental Chronicles", + imageRes = R.drawable.character2 + ), + ActorItem( + id = 1, + avatarRes = R.drawable.avatar1, + rating = 9.5f, + characterName = "Lin Feng", + age = 18, + tags = listOf("#Xianxia", "#Swordsmanship", "#Cultivation"), + description = "Once a prodigy, Lin Feng had his cultivation shattered and was cast out of his clan. Now he must reclaim his former glory through relentless effort and uncover the conspiracy that destroyed him.", + workTitle = "The Last Oracle of Kael", + imageRes = R.drawable.character1 + ), + ActorItem( + id = 2, + avatarRes = R.drawable.avatar2, + rating = 9.2f, + characterName = "Yue Ling", + age = 16, + tags = listOf("#Fantasy", "#Magic", "#Adventure"), + description = "A ancient magical artifacts.", + workTitle = "Elemental Chronicles", + imageRes = R.drawable.character2 + ), + ActorItem( + id = 1, + avatarRes = R.drawable.avatar1, + rating = 9.5f, + characterName = "Lin Feng", + age = 18, + tags = listOf("#Xianxia", "#Swordsmanship", "#Cultivation"), + description = "ory through relentless effort and uncover the conspiracy that destroyed him.", + workTitle = "The Last Oracle of Kael", + imageRes = R.drawable.character1 + ), + ActorItem( + id = 2, + avatarRes = R.drawable.avatar2, + rating = 9.2f, + characterName = "Yue Ling", + age = 16, + tags = listOf("#Fantasy", "#Magic", "#Adventure"), + description = "A young mage with exceptional talent in elemental magic, on a journey to discover ancient magical artifacts.", + workTitle = "Elemental Chronicles", + imageRes = R.drawable.character2 + ) + ) + } + private fun initTagLayout() { with(binding) { - // 模拟数据 val tags = listOf( ActorTagBean("1", "Youth"), ActorTagBean("2", "Lolita"), @@ -73,4 +188,22 @@ class ActorListFragment : BaseBindingFragment() { } } + object LayoutManagerHelper { + fun createAdaptiveStaggeredGridLayoutManager(): StaggeredGridLayoutManager { + val displayMetrics = NovelApplication.appContext().resources.displayMetrics + val screenWidthPx = displayMetrics.widthPixels + val screenWidthDp = screenWidthPx / displayMetrics.density + // 计算列数 + val columnCount = when { + screenWidthDp >= 600 -> { + max(3, (screenWidthDp / 200).toInt()) + } + else -> { + 2 + } + } + return StaggeredGridLayoutManager(columnCount, StaggeredGridLayoutManager.VERTICAL) + } + } + } \ No newline at end of file diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorListViewModel.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorListViewModel.kt index 323ebb8..d1f5fd8 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorListViewModel.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorListViewModel.kt @@ -5,7 +5,6 @@ import com.remax.visualnovel.entity.response.Book import com.remax.visualnovel.app.viewmodel.base.BaseViewModel import com.remax.visualnovel.entity.response.base.Response import com.remax.visualnovel.repository.api.ActorsRepository -import com.remax.visualnovel.repository.api.BooksRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorsAdapter.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorsAdapter.kt new file mode 100644 index 0000000..485d125 --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/ActorsAdapter.kt @@ -0,0 +1,33 @@ +package com.remax.visualnovel.ui.main.actor + + +import com.chad.library.adapter.base.module.LoadMoreModule +import com.remax.visualnovel.R +import com.remax.visualnovel.app.BaseBindingQuickAdapter +import com.remax.visualnovel.databinding.FragmentMainActorItemBinding + +class ActorsAdapter : BaseBindingQuickAdapter(FragmentMainActorItemBinding::inflate), LoadMoreModule { + init { + addChildClickViewIds(R.id.top_container_left_top) + + setOnItemChildClickListener { _, _, position -> + val item = getItem(position) + // TODO - goto + } + } + + + override fun convert(holder: BaseBindingHolder, item: ActorItem) { + holder.getViewBinding().run { + ivCharacter.setImageResource(item.imageRes) + ivFrom.setImageResource(item.avatarRes) + + tvFrom.text = item.from + tvScore.text = "%.1f".format(item.rating) + tvChapterNum.text = "${item.characterName}·${item.age}" + tvLables.text = item.tags.toString() + tvDescription.text = item.description + tvLast.text = "[${item.workTitle}]" + } + } +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/GridSpacingItemDecoration.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/GridSpacingItemDecoration.kt new file mode 100644 index 0000000..22f5eed --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/actor/GridSpacingItemDecoration.kt @@ -0,0 +1,30 @@ +package com.remax.visualnovel.ui.main.actor + +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager + +class GridSpacingItemDecoration(private val spacing: Int) : RecyclerView.ItemDecoration() { + + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + val position = parent.getChildAdapterPosition(view) + val layoutManager = parent.layoutManager as? StaggeredGridLayoutManager + val spanCount = layoutManager?.spanCount ?: 2 + + val column = position % spanCount + + outRect.left = spacing - column * spacing / spanCount + outRect.right = (column + 1) * spacing / spanCount + + if (position < spanCount) { + outRect.top = spacing + } + outRect.bottom = spacing + } +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/drawable/avatar1.webp b/VisualNovel/app/src/main/res/drawable/avatar1.webp new file mode 100644 index 0000000..13545c4 Binary files /dev/null and b/VisualNovel/app/src/main/res/drawable/avatar1.webp differ diff --git a/VisualNovel/app/src/main/res/drawable/avatar2.webp b/VisualNovel/app/src/main/res/drawable/avatar2.webp new file mode 100644 index 0000000..13545c4 Binary files /dev/null and b/VisualNovel/app/src/main/res/drawable/avatar2.webp differ diff --git a/VisualNovel/app/src/main/res/drawable/avatar_placeholder.webp b/VisualNovel/app/src/main/res/drawable/avatar_placeholder.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/VisualNovel/app/src/main/res/drawable/avatar_placeholder.webp differ diff --git a/VisualNovel/app/src/main/res/drawable/card_background.xml b/VisualNovel/app/src/main/res/drawable/card_background.xml new file mode 100644 index 0000000..ff59365 --- /dev/null +++ b/VisualNovel/app/src/main/res/drawable/card_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/drawable/character1.png b/VisualNovel/app/src/main/res/drawable/character1.png new file mode 100644 index 0000000..9aedac1 Binary files /dev/null and b/VisualNovel/app/src/main/res/drawable/character1.png differ diff --git a/VisualNovel/app/src/main/res/drawable/character2.png b/VisualNovel/app/src/main/res/drawable/character2.png new file mode 100644 index 0000000..785cef3 Binary files /dev/null and b/VisualNovel/app/src/main/res/drawable/character2.png differ diff --git a/VisualNovel/app/src/main/res/drawable/character_placeholder.png b/VisualNovel/app/src/main/res/drawable/character_placeholder.png new file mode 100644 index 0000000..9a19629 Binary files /dev/null and b/VisualNovel/app/src/main/res/drawable/character_placeholder.png differ diff --git a/VisualNovel/app/src/main/res/drawable/custom_corner_bg.xml b/VisualNovel/app/src/main/res/drawable/custom_corner_bg.xml new file mode 100644 index 0000000..389fc89 --- /dev/null +++ b/VisualNovel/app/src/main/res/drawable/custom_corner_bg.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/drawable/rating_background.xml b/VisualNovel/app/src/main/res/drawable/rating_background.xml new file mode 100644 index 0000000..a9d0220 --- /dev/null +++ b/VisualNovel/app/src/main/res/drawable/rating_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/drawable/tag_background.xml b/VisualNovel/app/src/main/res/drawable/tag_background.xml new file mode 100644 index 0000000..3d24b32 --- /dev/null +++ b/VisualNovel/app/src/main/res/drawable/tag_background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/fragment_main_actor.xml b/VisualNovel/app/src/main/res/layout/fragment_main_actor.xml index 7fedecc..d475568 100644 --- a/VisualNovel/app/src/main/res/layout/fragment_main_actor.xml +++ b/VisualNovel/app/src/main/res/layout/fragment_main_actor.xml @@ -12,7 +12,7 @@ @@ -32,14 +32,22 @@ android:id="@+id/tagFlowLayout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="16dp" - app:tag_horizontal_spacing="10dp" - app:tag_vertical_spacing="8dp" - app:tag_text_size="12sp" + android:padding="@dimen/dp_16" + app:tag_horizontal_spacing="@dimen/dp_10" + app:tag_vertical_spacing="@dimen/dp_8" + app:tag_text_size="@dimen/sp_12" app:tag_max_lines="1" app:tag_text_color="@color/white" app:tag_each_line_max_num="2" app:tag_expand_drawable="@mipmap/tag_flow_expand" app:tag_shrink_drawable="@mipmap/tag_flow_shrink" /> + + diff --git a/VisualNovel/app/src/main/res/layout/fragment_main_actor_feature_item.xml b/VisualNovel/app/src/main/res/layout/fragment_main_actor_feature_item.xml new file mode 100644 index 0000000..30a08d1 --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/fragment_main_actor_feature_item.xml @@ -0,0 +1,13 @@ + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/layout/fragment_main_actor_item.xml b/VisualNovel/app/src/main/res/layout/fragment_main_actor_item.xml new file mode 100644 index 0000000..901bb3c --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/fragment_main_actor_item.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/mipmap-hdpi/img.png b/VisualNovel/app/src/main/res/mipmap-hdpi/img.png new file mode 100644 index 0000000..e10003f Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-hdpi/img.png differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_book_big.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_book_big.webp new file mode 100644 index 0000000..b415450 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_book_big.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_bg_1.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_bg_1.webp new file mode 100644 index 0000000..44302d9 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_bg_1.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_bg_2.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_bg_2.webp new file mode 100644 index 0000000..4156c11 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_bg_2.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_bg_3.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_bg_3.webp new file mode 100644 index 0000000..1326f4a Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_bg_3.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_big.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_big.webp new file mode 100644 index 0000000..e011349 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_big.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_small.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_small.webp new file mode 100644 index 0000000..c66e6d9 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_from_small.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_video_big.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_video_big.webp new file mode 100644 index 0000000..a22dae3 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_video_big.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_video_small.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_video_small.webp new file mode 100644 index 0000000..ece3805 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/actor_item_video_small.webp differ diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/score.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/score.webp new file mode 100644 index 0000000..f33e326 Binary files /dev/null and b/VisualNovel/app/src/main/res/mipmap-xxhdpi/score.webp differ diff --git a/VisualNovel/app/src/main/res/values/colors.xml b/VisualNovel/app/src/main/res/values/colors.xml index e96e1d1..58217c7 100644 --- a/VisualNovel/app/src/main/res/values/colors.xml +++ b/VisualNovel/app/src/main/res/values/colors.xml @@ -185,6 +185,9 @@ #ffbac5d2 #ff0065ff #ffe5f1ff + #FFFF00 + #FF8800 + diff --git a/VisualNovel/app/src/main/res/values/dimens.xml b/VisualNovel/app/src/main/res/values/dimens.xml index 78e3401..ca85cd4 100644 --- a/VisualNovel/app/src/main/res/values/dimens.xml +++ b/VisualNovel/app/src/main/res/values/dimens.xml @@ -65,7 +65,7 @@ Poppins D-Din - + Poppins Bangers @@ -143,4 +143,242 @@ 240dp 300dp + + + + + + 1dp + 2dp + 3dp + 4dp + 5dp + 6dp + 7dp + 8dp + 9dp + 10dp + 11dp + 12dp + 13dp + 14dp + 15dp + 16dp + 17dp + 18dp + 19dp + 20dp + 21dp + 22dp + 23dp + 24dp + 25dp + 26dp + 27dp + 28dp + 29dp + 30dp + 31dp + 32dp + 33dp + 34dp + 35dp + 36dp + 37dp + 38dp + 39dp + 40dp + 41dp + 42dp + 43dp + 44dp + 45dp + 46dp + 47dp + 48dp + 49dp + 50dp + 51dp + 52dp + 53dp + 54dp + 55dp + 56dp + 57dp + 58dp + 59dp + 60dp + 61dp + 62dp + 63dp + 64dp + 65dp + 66dp + 67dp + 68dp + 69dp + 70dp + 71dp + 72dp + 73dp + 74dp + 75dp + 76dp + 77dp + 78dp + 79dp + 80dp + 81dp + 82dp + 83dp + 84dp + 85dp + 86dp + 87dp + 88dp + 89dp + 90dp + 91dp + 92dp + 93dp + 94dp + 95dp + 96dp + 97dp + 98dp + 99dp + 100dp + 101dp + 102dp + 103dp + 104dp + 105dp + 106dp + 107dp + 108dp + 109dp + 110dp + 111dp + 112dp + 113dp + 114dp + 115dp + 116dp + 117dp + 118dp + 119dp + 120dp + 121dp + 122dp + 123dp + 124dp + 125dp + 126dp + 127dp + 128dp + 129dp + 130dp + 131dp + 132dp + 133dp + 134dp + 135dp + 136dp + 137dp + 138dp + 139dp + 140dp + 141dp + 142dp + 143dp + 144dp + 145dp + 146dp + 147dp + 148dp + 149dp + 150dp + 151dp + 152dp + 153dp + 154dp + 155dp + 156dp + 157dp + 158dp + 159dp + 160dp + 161dp + 162dp + 163dp + 164dp + 165dp + 166dp + 167dp + 168dp + 169dp + 170dp + 171dp + 172dp + 173dp + 174dp + 175dp + 176dp + 177dp + 178dp + 179dp + 180dp + 181dp + 182dp + 183dp + 184dp + 185dp + 186dp + 187dp + 188dp + 189dp + 190dp + 191dp + 192dp + 193dp + 194dp + 195dp + 196dp + 197dp + 198dp + 199dp + 200dp + + 1sp + 2sp + 3sp + 4sp + 5sp + 6sp + 7sp + 8sp + 9sp + 10sp + 11sp + 12sp + 13sp + 14sp + 15sp + 16sp + 17sp + 18sp + 19sp + 20sp + 21sp + 22sp + 23sp + 24sp + 25sp + 26sp + 27sp + 28sp + 29sp + 30sp + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/values/strings.xml b/VisualNovel/app/src/main/res/values/strings.xml index 513ab57..cf9cff2 100644 --- a/VisualNovel/app/src/main/res/values/strings.xml +++ b/VisualNovel/app/src/main/res/values/strings.xml @@ -463,4 +463,6 @@ Contact Us: support@VisualNovel.ai All + from + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/values/styles.xml b/VisualNovel/app/src/main/res/values/styles.xml index 00be17c..92f680c 100644 --- a/VisualNovel/app/src/main/res/values/styles.xml +++ b/VisualNovel/app/src/main/res/values/styles.xml @@ -230,4 +230,14 @@ @anim/anim_keep @anim/anim_keep + + + +