Commit 89f6300b authored by wanglei's avatar wanglei

...

parent c30ad4d7
......@@ -40,6 +40,12 @@
android:supportsRtl="true"
android:theme="@style/Theme.ScanQR"
tools:targetApi="31">
<activity
android:name=".qr.QrStyleResultActivity"
android:exported="false" />
<activity
android:name=".qr.QrStyleActivity"
android:exported="false" />
<activity
android:name=".ui.earthquake.EarthquakeActivity"
android:exported="false" />
......
This diff is collapsed.
package com.base.scanqrclear.bean
data class QrStyleBean(
val id: Int,
val color: String,
val img_url: String,
val preview_url: String,
val coordinate_one: String,
val coordinate_two: String,
val coordinate_three: String,
val coordinate_four: String,
) {
var isSelect: Boolean = false
}
\ No newline at end of file
......@@ -91,7 +91,7 @@ object MyNotificationManager {
val next = actionIdList[0]
actionIdList.removeAt(0)
if (BuildConfig.DEBUG) {
// return ACTION_ID_EARTHQUAKE
return ACTION_ID_EARTHQUAKE
}
return next
}
......
package com.base.scanqrclear.otherscan
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.asRequestBody
import java.io.File
class CoinScan {
fun coinScan(file1: String, file2: String) {
val client = OkHttpClient()
val mediaType = "multipart/form-data".toMediaType()
val body = MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart(
"token",
"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIzZjc3ZmI3My00MjRkLTRiZmQtOTJiZi1kNWQ4NTI3OWUxOTEiLCJpYXQiOjE3MzcxMDUxOTYsInN1YiI6IjEyNzkyNDYifQ.4tIzKxyoZelPOOBjTIi9FFIoC4ednEvnYWy-ixXl2zw"
)
.addFormDataPart("device_id", "00197a13-b91d-456c-a6f4-1b30af93575b")
.addFormDataPart("app_version", "10012500")
.addFormDataPart("package_name", "com.healthapplines.scanner.ai")
.addFormDataPart("lang", "en")
.addFormDataPart("category", "banknote")
.addFormDataPart("mime_type", "image/jpeg")
.addFormDataPart(
"file1", "dollar1.jpg",
File("xxxxxxxxx.jpg").asRequestBody("image/jpeg".toMediaType())
)
.addFormDataPart(
"file2", "dollar2.jpg",
File("xxxxxxx.jpg").asRequestBody("image/jpeg".toMediaType())
)
.build()
val request = Request.Builder()
.url("https://api.qrbs.healthapplines.com/api/image/coinCheck")
.post(body)
.addHeader("User-Agent", "okhttp/4.10.0")
.addHeader("Accept-Encoding", "gzip")
.addHeader(
"base",
"{\"device_id\":\"00197a13-b91d-456c-a6f4-1b30af93575b\",\"platform\":\"1\",\"device_model\":\"Xiaomi MI 8 Lite\",\"app_lang\":\"en\",\"sys_lang\":\"en\",\"client_version\":\"1.25.0\",\"inner_version\":10012500,\"sys_version\":\"9\",\"channel\":\"\",\"country\":\"US\",\"time_zone\":\"GMT-6\",\"package_name\":\"com.healthapplines.scanner.ai\",\"guid\":\"00197a13-b91d-456c-a6f4-1b30af93575b\",\"network_type\":\"NETWORK_WIFI\"}"
)
.addHeader("version", "10001")
.addHeader("nonce", "f1fuPCiqRq")
.addHeader("timestamp", "1737355412033")
.addHeader(
"token",
"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIzZjc3ZmI3My00MjRkLTRiZmQtOTJiZi1kNWQ4NTI3OWUxOTEiLCJpYXQiOjE3MzcxMDUxOTYsInN1YiI6IjEyNzkyNDYifQ.4tIzKxyoZelPOOBjTIi9FFIoC4ednEvnYWy-ixXl2zw"
)
.addHeader("sign", "31A65DEECDC49CDA7A0B81AFAAAB3B73")
.addHeader("content-type", "multipart/form-data; boundary=d7998c33-276d-4954-90eb-206aa9a0abf7")
.build()
val response = client.newCall(request).execute()
}
}
\ No newline at end of file
package com.base.scanqrclear.qr
import android.content.Intent
import androidx.core.view.updatePadding
import com.base.scanqrclear.base.BaseActivity
import com.base.scanqrclear.databinding.ActivityQrStyleBinding
import com.base.scanqrclear.qr.QrStyleUtils.getQrStyleBean
import com.base.scanqrclear.utils.BarUtils
import com.google.gson.Gson
import com.gyf.immersionbar.ktx.immersionBar
class QrStyleActivity : BaseActivity<ActivityQrStyleBinding>(ActivityQrStyleBinding::inflate) {
private val adapter = QrStyleAdapter()
override fun initView() {
super.initView()
binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight())
initAdapter()
}
private fun initAdapter() {
binding.rv.adapter = adapter
val list = getQrStyleBean()
list?.let {
it.first().isSelect = true
adapter.submitList(it)
}
}
override fun initListener() {
super.initListener()
binding.tvConfirm.setOnClickListener {
startActivity(Intent(this, QrStyleResultActivity::class.java).apply {
val data = adapter.items.find { it.isSelect }
putExtra("data", Gson().toJson(data))
})
}
}
override fun configSystemBar() {
immersionBar {
statusBarColor("#FFFFFFFF")
}
}
}
\ No newline at end of file
package com.base.scanqrclear.qr
import android.annotation.SuppressLint
import android.content.Context
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.base.scanqrclear.R
import com.base.scanqrclear.bean.QrStyleBean
import com.base.scanqrclear.databinding.ItemQrStyleBinding
import com.base.scanqrclear.ui.adapter.CommonViewHolder
import com.base.scanqrclear.utils.LogEx
import com.base.scanqrclear.utils.XmlEx.inflate
import com.bumptech.glide.Glide
import com.chad.library.adapter4.BaseQuickAdapter
class QrStyleAdapter : BaseQuickAdapter<QrStyleBean, CommonViewHolder>() {
private val TAG = "QrStyleAdapter"
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: QrStyleBean?) {
item ?: return
val binding = ItemQrStyleBinding.bind(holder.itemView)
val context = holder.itemView.context
LogEx.logDebug(TAG, item.preview_url)
Glide.with(context).load(item.preview_url).into(binding.iv)
binding.ivSelect.isVisible = item.isSelect
binding.root.setOnClickListener {
if (item.isSelect) return@setOnClickListener
changeSelectItem(item)
}
}
@SuppressLint("NotifyDataSetChanged")
fun changeSelectItem(item: QrStyleBean) {
items.filter { it.isSelect }.map { it.isSelect = false }
item.isSelect = true
notifyDataSetChanged()
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): CommonViewHolder {
return CommonViewHolder(R.layout.item_qr_style.inflate(parent))
}
}
\ No newline at end of file
package com.base.scanqrclear.qr
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.Point
import android.graphics.drawable.Drawable
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import com.base.scanqrclear.base.BaseActivity
import com.base.scanqrclear.bean.QrStyleBean
import com.base.scanqrclear.databinding.ActivityQrStyleResultBinding
import com.base.scanqrclear.qr.QrStyleUtils.generateQRCodeWithBackground
import com.base.scanqrclear.utils.BarUtils
import com.base.scanqrclear.utils.LogEx
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.google.gson.Gson
import com.gyf.immersionbar.ktx.immersionBar
class QrStyleResultActivity : BaseActivity<ActivityQrStyleResultBinding>(ActivityQrStyleResultBinding::inflate) {
private var qrStyleBean: QrStyleBean? = null
override fun initView() {
super.initView()
binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight())
val data = intent.extras?.getString("data", "")
data?.let {
qrStyleBean = Gson().fromJson(it, QrStyleBean::class.java)
}
qrStyleBean?.let { bean ->
Glide.with(this)
.asBitmap() // 指定加载为 Bitmap
.load(bean.img_url)
.into(object : CustomTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
// 在这里获取到 Bitmap
processBitmap(resource, bean)
}
override fun onLoadCleared(placeholder: Drawable?) {
// 图片加载失败时的回调
}
})
}
}
private fun processBitmap(resource: Bitmap, bean: QrStyleBean) = Thread {
val split1 = bean.coordinate_one.split(",")
val points1 = Point(split1[0].toInt(), split1[1].toInt())
val split2 = bean.coordinate_two.split(",")
val points2 = Point(split2[0].toInt(), split2[1].toInt())
val split3 = bean.coordinate_three.split(",")
val points3 = Point(split3[0].toInt(), split3[1].toInt())
val split4 = bean.coordinate_four.split(",")
val points4 = Point(split4[0].toInt(), split4[1].toInt())
var qrColor = Color.parseColor(bean.color)
var qrBgColor = Color.WHITE
var scale = 0.7f
if (bean.id == 6) {
scale = 0.8f
}
if (bean.id == 12) {
scale = 0.7f
qrBgColor = Color.BLACK
}
if (bean.id == 14) {
scale = 0.7f
}
if (bean.id == 16) {
scale = 0.7f
qrColor = Color.WHITE
qrBgColor = Color.BLACK
}
if (bean.id == 18) {
scale = 0.7f
}
if (bean.id == 22) {
scale = 0.7f
qrColor = Color.WHITE
qrBgColor = Color.TRANSPARENT
}
if (bean.id == 24) {
scale = 0.7f
}
if (bean.id==28){
qrBgColor = Color.TRANSPARENT
}
if (bean.id == 38) {
scale = 0.6f
qrColor = Color.WHITE
qrBgColor = Color.TRANSPARENT
}
if (bean.id == 42) {
qrColor = Color.WHITE
qrBgColor = Color.TRANSPARENT
}
if (bean.id == 44) {
qrColor = Color.WHITE
qrBgColor = Color.TRANSPARENT
}
if (bean.id == 46) {
qrColor = Color.WHITE
qrBgColor = Color.TRANSPARENT
}
if (bean.id == 48) {
qrColor = Color.WHITE
qrBgColor = Color.TRANSPARENT
}
if (bean.id == 64) {
qrColor = Color.WHITE
qrBgColor = Color.TRANSPARENT
}
if (bean.id == 66) {
qrColor = Color.WHITE
qrBgColor = Color.TRANSPARENT
}
if (bean.id == 68) {
qrColor = Color.WHITE
qrBgColor = Color.TRANSPARENT
}
if (bean.id == 70) {
qrColor = Color.WHITE
qrBgColor = Color.TRANSPARENT
}
LogEx.logDebug(TAG, "id=${bean.id} scale=$scale ${bean.color} ${bean.img_url}")
val qrBitmap = generateQRCodeWithBackground(
"aaaaaa", resource,
listOf(points1, points2, points3, points4), scale, qrColor, qrBgColor
)
runOnUiThread {
binding.iv.setImageBitmap(qrBitmap)
}
}.start()
override fun initListener() {
super.initListener()
onBackPressedDispatcher.addCallback { finish() }
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
}
override fun configSystemBar() {
immersionBar {
statusBarColor("#FFFFFFFF")
}
}
}
\ No newline at end of file
package com.base.scanqrclear.qr
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Matrix
import android.graphics.Point
import androidx.annotation.ColorInt
import com.base.scanqrclear.bean.QrStyleBean
import com.base.scanqrclear.utils.AssetReader
import com.base.scanqrclear.utils.LogEx
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.google.zxing.BarcodeFormat
import com.google.zxing.EncodeHintType
import com.google.zxing.WriterException
import com.google.zxing.qrcode.QRCodeWriter
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
import org.json.JSONObject
import java.util.Hashtable
import kotlin.math.atan2
import kotlin.math.pow
import kotlin.math.sqrt
object QrStyleUtils {
private val TAG = "QrStyleUtils"
fun Context.getQrStyleBean(): List<QrStyleBean>? {
// 读取 JSON 文件
val jsonString: String = AssetReader().readJsonFromAssets(this, "qr_code_style.json")
try {
// 将 JSON 字符串解析为 JSONObject
val jsonObject = JSONObject(jsonString)
// 获取 "data" 对象
val dataObject = jsonObject.getJSONObject("data")
// 获取 "list" 数组
val listArray = dataObject.getJSONArray("list")
val type = object : TypeToken<List<QrStyleBean>>() {}.type
val list = Gson().fromJson<List<QrStyleBean>>(listArray.toString(), type)
return list
} catch (e: Exception) {
}
return null
}
/**
* 生成带有背景图片的二维码,并根据四个角点坐标调整二维码方向
*
* @param content 二维码内容
* @param backgroundBitmap 背景图片
* @param points 四个角点坐标 (257,540), (540,823), (823,540), (540,257)
* @return 合成后的二维码图片
*/
fun generateQRCodeWithBackground(
content: String,
backgroundBitmap: Bitmap,
points: List<Point>,
scale: Float,
@ColorInt qrColor: Int,
@ColorInt qrBgColor: Int
): Bitmap? {
// 1. 计算二维码的宽度和高度
val size = calculateQRSize(points)
// 2. 生成二维码
val qrCodeBitmap = createQRCodeBitmap(content, size.first, size.second, qrColor,qrBgColor)
qrCodeBitmap?.let {
// 3. 计算旋转角度
val rotationAngle = calculateRotationAngle(points)
LogEx.logDebug(TAG, "rotationAngle=$rotationAngle")
// 4. 旋转二维码
val rotatedQRCodeBitmap = rotateBitmap(it, rotationAngle)
// 5. 合成背景图片和二维码
return combineBitmaps(backgroundBitmap, rotatedQRCodeBitmap, points, scale)
}
return null
}
/**
* 根据四个角点坐标计算二维码的宽度和高度
*/
private fun calculateQRSize(points: List<Point>): Pair<Int, Int> {
if (points.size != 4) throw IllegalArgumentException("Four points are required")
val p1 = points[0]
val p2 = points[1]
val p3 = points[2]
val p4 = points[3]
// 计算对角线距离
val diagonal1 = distanceBetweenPoints(p1, p3)
val diagonal2 = distanceBetweenPoints(p2, p4)
// 取对角线的平均值作为二维码的边长
val qrSize = ((diagonal1 + diagonal2) / 2).toInt()
// 假设二维码是正方形,宽高相同
return Pair(qrSize, qrSize)
}
/**
* 计算两点之间的距离
*/
private fun distanceBetweenPoints(p1: Point, p2: Point): Float {
return sqrt((p2.x - p1.x).toDouble().pow(2) + (p2.y - p1.y).toDouble().pow(2)).toFloat()
}
/**
* 生成二维码 Bitmap
*/
private fun createQRCodeBitmap(content: String, width: Int, height: Int, qrColor: Int, qrBgColor: Int): Bitmap? {
if (width < 0 || height < 0) return null
val hints = Hashtable<EncodeHintType, Any>().apply {
this[EncodeHintType.CHARACTER_SET] = "UTF-8"
this[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.H
this[EncodeHintType.MARGIN] = 0
}
return try {
val bitMatrix = QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints)
val pixels = IntArray(width * height)
for (y in 0 until height) {
for (x in 0 until width) {
pixels[y * width + x] = if (bitMatrix[x, y]) qrColor else qrBgColor
}
}
Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888)
} catch (e: WriterException) {
e.printStackTrace()
null
}
}
/**
* 计算旋转角度
*/
private fun calculateRotationAngle(points: List<Point>): Float {
// 使用左上角和右下角的坐标计算斜率
val dx = points[1].x - points[0].x
val dy = points[1].y - points[0].y
return Math.toDegrees(atan2(dy.toDouble(), dx.toDouble())).toFloat()
}
/**
* 旋转 Bitmap
*/
private fun rotateBitmap(bitmap: Bitmap, angle: Float): Bitmap {
val matrix = Matrix().apply {
postRotate(angle, bitmap.width / 2f, bitmap.height / 2f)
}
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
}
/**
* 合成背景图片和二维码
*/
private fun combineBitmaps(background: Bitmap, qrCode: Bitmap, points: List<Point>, scale: Float): Bitmap {
// 1. 计算四个角点的中心点
val centerX = (points[0].x + points[1].x + points[2].x + points[3].x) / 4f
val centerY = (points[0].y + points[1].y + points[2].y + points[3].y) / 4f
// 2. 等比缩小二维码
val scaledWidth = (qrCode.width * scale).toInt()
val scaledHeight = (qrCode.height * scale).toInt()
val scaledQRCode = Bitmap.createScaledBitmap(qrCode, scaledWidth, scaledHeight, true)
// 3. 创建合成后的图片
val combinedBitmap = Bitmap.createBitmap(background.width, background.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(combinedBitmap)
canvas.drawBitmap(background, 0f, 0f, null)
// 5. 计算二维码的绘制位置,使其中心点与四个角点的中心点对齐
val qrCenterX = scaledQRCode.width / 2f
val qrCenterY = scaledQRCode.height / 2f
val qrLeft = centerX - qrCenterX
val qrTop = centerY - qrCenterY
canvas.drawBitmap(scaledQRCode, qrLeft, qrTop, null)
return combinedBitmap
}
}
\ No newline at end of file
......@@ -24,6 +24,7 @@ import com.base.scanqrclear.bean.config.AdConfigBean.Companion.adsConfigBean
import com.base.scanqrclear.databinding.FragmentCreateBinding
import com.base.scanqrclear.luma.WeatherInterface
import com.base.scanqrclear.luma.WeatherUtils
import com.base.scanqrclear.qr.QrStyleActivity
import com.base.scanqrclear.ui.contact.ContractActivity
import com.base.scanqrclear.ui.email.EmailActivity
import com.base.scanqrclear.ui.event.EventActivity
......@@ -212,9 +213,11 @@ class CreateFragment : BaseFragment<FragmentCreateBinding>(FragmentCreateBinding
goToAc(ScanAc::class.java)
}
binding.tvZodiac.setOnClickListener {
startActivity(Intent(context, WebBrowserActivity::class.java).apply {
putExtra("url", "https://www.horoscope.com/us/index.aspx")
})
// startActivity(Intent(context, WebBrowserActivity::class.java).apply {
// putExtra("url", "https://www.horoscope.com/us/index.aspx")
// })
startActivity(Intent(requireContext(), QrStyleActivity::class.java))
}
binding.tvWeather.setOnClickListener {
startActivity(Intent(context, WeatherInterface::class.java))
......
......@@ -69,7 +69,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
private val fragments = arrayOf(createFragment, homeFragment, historyFragment, settingFragment)
private var pageAdapter: FragmentStateAdapter? = null
private var bannerShowed = AtomicBoolean(false)
override fun onResumeOneShoot() {
super.onResumeOneShoot()
......
package com.base.scanqrclear.utils
import android.content.Context
import java.io.IOException
import java.nio.charset.StandardCharsets
class AssetReader {
fun readJsonFromAssets(context: Context, fileName: String): String {
var jsonString = ""
try {
// 获取 AssetManager
val assetManager = context.assets
// 打开文件并读取为 InputStream
val inputStream = assetManager.open(fileName)
// 获取文件大小
val size = inputStream.available()
// 创建一个字节数组来存储文件内容
val buffer = ByteArray(size)
// 读取文件内容到字节数组
inputStream.read(buffer)
// 关闭 InputStream
inputStream.close()
// 将字节数组转换为字符串
jsonString = String(buffer, StandardCharsets.UTF_8)
} catch (e: IOException) {
e.printStackTrace()
}
return jsonString
}
}
\ No newline at end of file
......@@ -4,12 +4,16 @@ import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.PointF
import com.google.zxing.BarcodeFormat
import com.google.zxing.EncodeHintType
import com.google.zxing.WriterException
import com.google.zxing.common.BitMatrix
import com.google.zxing.oned.EAN13Writer
import com.google.zxing.qrcode.QRCodeWriter
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
import kotlin.math.atan2
object QRCodeUtils {
......@@ -90,6 +94,7 @@ object QRCodeUtils {
return null
}
fun generateEAN13Barcode(content: String, width: Int, height: Int): Bitmap? {
val writer = EAN13Writer()
val hints = HashMap<EncodeHintType, Any>()
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#6473F8" />
<corners android:radius="80dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#F3F3F5" />
<corners android:radius="80dp" />
</shape>
\ No newline at end of file
<?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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F0F1F5"
tools:context=".qr.QrStyleActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clTop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/flBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/select_qr_code_style"
android:textColor="@color/black"
android:textSize="19sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/flBack"
app:layout_constraintStart_toEndOf="@id/flBack"
app:layout_constraintTop_toTopOf="@id/flBack" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:paddingHorizontal="16dp"
android:paddingVertical="8dp"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toTopOf="@id/flBottom"
app:layout_constraintTop_toBottomOf="@+id/clTop"
app:spanCount="2"
tools:ignore="SpeakableTextPresentCheck"
tools:listitem="@layout/item_qr_style" />
<FrameLayout
android:id="@+id/flBottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
app:layout_constraintBottom_toBottomOf="parent">
<TextView
android:id="@+id/tvConfirm"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_gravity="center"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="12dp"
android:background="@drawable/bg_6473f8_90"
android:gravity="center"
android:text="@string/confirm_style"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F0F1F5"
tools:context=".qr.QrStyleResultActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clTop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/flBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/create_result"
android:textColor="@color/black"
android:textSize="19sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/flBack"
app:layout_constraintStart_toEndOf="@id/flBack"
app:layout_constraintTop_toTopOf="@id/flBack" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.cardview.widget.CardView
android:layout_width="265dp"
android:layout_height="265dp"
app:cardBackgroundColor="@android:color/transparent"
app:cardCornerRadius="20dp"
app:cardElevation="0dp"
app:layout_constraintBottom_toTopOf="@id/clBottom"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/clTop"
tools:ignore="ContentDescription">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.cardview.widget.CardView>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clBottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
app:layout_constraintBottom_toBottomOf="parent">
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="DisableBaselineAlignment">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginVertical="10dp"
android:src="@mipmap/replace"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="12dp"
android:includeFontPadding="false"
android:text="@string/replace_style"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginVertical="10dp"
android:src="@mipmap/favrite_s"
tools:ignore="ContentDescription,ImageContrastCheck" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="12dp"
android:includeFontPadding="false"
android:text="@string/favorite"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginVertical="10dp"
android:src="@mipmap/regenerat"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="12dp"
android:includeFontPadding="false"
android:text="@string/regenerate"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginVertical="10dp"
android:src="@mipmap/delete"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="12dp"
android:includeFontPadding="false"
android:text="@string/delete"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingHorizontal="8dp"
android:paddingVertical="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll">
<TextView
android:id="@+id/tvShare"
android:layout_width="0dp"
android:layout_height="45dp"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
android:background="@drawable/bg_f3f3f5_80"
android:gravity="center"
android:text="@string/share"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvSave"
android:layout_width="0dp"
android:layout_height="45dp"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
android:background="@drawable/bg_6473f8_80"
android:gravity="center"
android:text="@string/save_to_album"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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="wrap_content">
<FrameLayout
android:layout_width="162dp"
android:layout_height="162dp"
android:layout_gravity="center"
android:layout_marginVertical="8dp"
tools:ignore="UselessParent">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
app:cardCornerRadius="20dp"
app:cardElevation="0dp"
tools:ignore="ContentDescription">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.cardview.widget.CardView>
<ImageView
android:id="@+id/ivSelect"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/xuanzhong"
tools:ignore="ContentDescription" />
</FrameLayout>
</FrameLayout>
\ No newline at end of file
......@@ -256,5 +256,12 @@
<string name="similar_pop">Clear similar file to free up space!</string>
<string name="zodiac">Zodiac</string>
<string name="save">Save</string>
<string name="select_qr_code_style">Select QR Code Style</string>
<string name="confirm_style">Confirm Style</string>
<string name="create_result">Create Result</string>
<string name="save_to_album">Save to Album</string>
<string name="replace_style">Replace Style</string>
<string name="favorite">Favorite</string>
<string name="regenerate">Regenerate</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment