Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android studio 在Android图像上添加徽标_Android Studio_Android Fragments_Android Recyclerview_Layout_Bitmap - Fatal编程技术网

Android studio 在Android图像上添加徽标

Android studio 在Android图像上添加徽标,android-studio,android-fragments,android-recyclerview,layout,bitmap,Android Studio,Android Fragments,Android Recyclerview,Layout,Bitmap,我正在开发一款Android应用程序,它必须一次在图像上放置框架和徽标,我面临的问题是框架来自第一个片段,徽标来自第二个片段。我正在设置imageView上位图图像的边框以及徽标 我面临的问题是,当我成功地在位图图像上添加框架时,我还尝试在位图图像上设置徽标,它会删除框架并在位图上设置徽标,反之亦然 我真正想要的是帧和标志设置在位图上的时间 在这里,Logo通过方法从第一个片段适配器到主活动 holder.iconslogo.setOnClickListener { when

我正在开发一款Android应用程序,它必须一次在图像上放置框架和徽标,我面临的问题是框架来自第一个片段,徽标来自第二个片段。我正在设置imageView上位图图像的边框以及徽标

我面临的问题是,当我成功地在位图图像上添加框架时,我还尝试在位图图像上设置徽标,它会删除框架并在位图上设置徽标,反之亦然

我真正想要的是帧和标志设置在位图上的时间

在这里,Logo通过方法从第一个片段适配器到主活动

 holder.iconslogo.setOnClickListener {
        when (charItemlogo.itemsidlogo) {
            1 -> {
               var btmp=  arrayList[0].iconslogo
                (context as MakeStylishActivity).setLogos(btmp)
            }
这里的框架是从框架片段到主要活动的

  holder.iconsframe.setOnClickListener {

        when (charItemFrame.itemsidframe) {
            1 -> {
               var btmp=  arrayList[0].iconsframe
                (context as MakeStylishActivity).setFrames(btmp)
            }}
这是将徽标和框架设置为位图的主要活动

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_make_stylish)
    val byteArray = intent.getByteArrayExtra("pictures")
    bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)!!
    img_bitmap1.setImageBitmap(bmp)
    stringqrcontent= intent.getStringExtra("qrcontent")

    bottom_nav_viewstyle.setOnNavigationItemSelectedListener {
        when (it.itemId) {
            R.id.action_default -> {
                true
            }
            R.id.action_colors -> {
                ShowFColorFragment()
                true
            }
            R.id.action_logos -> {
                ShowLogoFragment()
                true
            }
            R.id.action_frames -> {
                FunctionAddFrames();
                true
            }
            R.id.action_patterns -> {
                true
            }
            else -> false
        }
    }
}

fun setLogos(btmp: Bitmap?) {
    //img_bitmap1.setImageBitmap(btmp)
    PutLogoOnQRBitmaps(btmp, bmp!!)
}

fun setFrames(btmp: Bitmap?) {
   // img_bitmap1.setImageBitmap(btmp)
    //addWhiteBorder(bmp!!,10)
    PutFrameImages(btmp, bmp!!)
}

//Combine Frame Behind QR Code
fun PutFrameImages(frame: Bitmap?, image: Bitmap): Bitmap? {
    var cs: Bitmap? = null
    var rs: Bitmap? = null
    rs = Bitmap.createScaledBitmap(frame!!, image.width, image.height, true)
    cs = Bitmap.createBitmap(rs.width, rs.height, Bitmap.Config.RGB_565)
    val comboImage = Canvas(cs)
    comboImage.drawBitmap(image, 0F, 0F, null)
    comboImage.drawBitmap(rs, 0F, 0F, null)
    if (rs != null) {
        rs.recycle()
        rs = null
    }
   // Runtime.getRuntime().gc()
    img_bitmap1.setImageBitmap(cs!!)
    return cs
}


//Put Logo on QR Code
fun PutLogoOnQRBitmaps(logo: Bitmap?, qrcode: Bitmap): Bitmap? {
    val combined = Bitmap.createBitmap(qrcode.width, qrcode.height, qrcode.config)
    val canvas = Canvas(combined)
    val canvasWidth = canvas.width
    val canvasHeight = canvas.height
    canvas.drawBitmap(qrcode, Matrix(), null)
    val resizeLogo = Bitmap.createScaledBitmap(logo!!, canvasWidth / 5, canvasHeight / 5, true)
    val centreX = (canvasWidth - resizeLogo.width) / 2
    val centreY = (canvasHeight - resizeLogo.height) / 2
    canvas.drawBitmap(resizeLogo, centreX.toFloat(), centreY.toFloat(), null)

    img_bitmap1.setImageBitmap(combined)
    return combined
}}

我在这里看到了一些不被认为是好主意的事情,但最重要的是意图的大小有一个限制(即非常小),并且不是为了传递大量数据而设计的

我会怎么做 不管您的架构过于简单(没有使用ViewModels,或者正确地分离关注点,以及这里忽略的一些其他原则……),我都不会通过intent传递图像。相反,我会将图像保存到文件系统(临时),将“路径”作为字符串传递给下一个活动,并让活动打开文件并从文件系统创建位图

这意味着您不再需要担心图像大小/意图大小过大,并且您的两个活动稍微解耦。现在,您可以在那里传递位图的任何路径,而其他活动将拾取它,无论它来自何处

第二个改进是将所有这些(图像存储、传递、检索等)委托给ViewModel+UseCase(和/或存储库),在这种情况下,您将进一步解耦代码。对于这一点,以及更多,起点将是;我建议至少尝试在您的体系结构中利用

您还需要注意,在不知从何处创建位图时,您可以通过执行正在执行的操作轻松耗尽内存;你应该