国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android Glide自定義AppCompatImageView切分成若干小格子,每個小格子onDraw繪制Bitmap,Kotlin(1)

這篇具有很好參考價值的文章主要介紹了Android Glide自定義AppCompatImageView切分成若干小格子,每個小格子onDraw繪制Bitmap,Kotlin(1)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Android Glide自定義AppCompatImageView切分成若干小格子,每個小格子onDraw繪制Bitmap,Kotlin(1)

?文章來源地址http://www.zghlxwxcb.cn/news/detail-759927.html

垂直方向的RecyclerView,每行一個AppCompatImageView,每個AppCompatImageView被均勻切割成n個小格子, 每個小格子通過Glide加載出來Bitmap,然后onDraw繪制整行。

?

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

?

implementation("com.github.bumptech.glide:glide:4.16.0")

?

import android.content.Context
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext


class MainActivity : AppCompatActivity() {
    companion object {
        const val VIEW_TYPE = 0
        const val TAG = "fly/MainActivity"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val rv = findViewById<RecyclerView>(R.id.recycler_view)

        val layoutManager = LinearLayoutManager(this)
        layoutManager.orientation = LinearLayoutManager.VERTICAL
        rv.layoutManager = layoutManager

        val adapter = MyAdapter()
        rv.adapter = adapter

        lifecycleScope.launch(Dispatchers.IO) {
            val items = readAllImage(this@MainActivity)
            items.reverse()

            val data = sliceDataList(items)
            withContext(Dispatchers.Main) {
                adapter.dataChanged(data)
            }
        }
    }

    private fun sliceDataList(data: ArrayList<MyData>): ArrayList<ArrayList<MyData>> {
        var k: Int
        val lists = ArrayList<ArrayList<MyData>>()
        for (i in data.indices step BatchBitmapView.ROW_SIZE) {
            val temp = ArrayList<MyData>()

            k = 0
            for (j in 0 until BatchBitmapView.ROW_SIZE) {
                k = i + j
                if (k >= data.size) {
                    break
                }
                temp.add(data[k])
            }

            lists.add(temp)
        }

        return lists
    }

    class MyAdapter : RecyclerView.Adapter<MyVH>() {
        private var items = ArrayList<ArrayList<MyData>>()

        fun dataChanged(items: ArrayList<ArrayList<MyData>>) {
            this.items = items

            notifyDataSetChanged()
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyVH {
            Log.d(TAG, "onCreateViewHolder")
            val view = BatchBitmapView(parent.context)
            return MyVH(view)
        }

        override fun getItemCount(): Int {
            return items.size
        }

        override fun getItemViewType(position: Int): Int {
            return VIEW_TYPE
        }

        override fun onBindViewHolder(holder: MyVH, position: Int) {
            Log.d(TAG, "onBindViewHolder $position")
            val biv = (holder.itemView as? BatchBitmapView)
            biv?.setRowBitmapData(items[position], position)
        }
    }

    class MyVH(itemView: BatchBitmapView) : RecyclerView.ViewHolder(itemView) {

    }

    class MyData(var path: String, var index: Int)

    private fun readAllImage(context: Context): ArrayList<MyData> {
        val photos = ArrayList<MyData>()

        //讀取所有圖片
        val cursor = context.contentResolver.query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null
        )

        var index = 0
        while (cursor!!.moveToNext()) {
            //路徑 uri
            val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA))

            //圖片名稱
            //val name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))

            //圖片大小
            //val size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE))

            photos.add(MyData(path, index++))
        }
        cursor.close()

        return photos
    }
}

?

?

?

import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.util.Log
import androidx.appcompat.widget.AppCompatImageView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition


class BatchBitmapView @JvmOverloads constructor(
    context: Context,
    attributeSet: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatImageView(context, attributeSet, defStyleAttr) {
    private val mData = mutableListOf<DataBean>()
    private val mScreenWidth = resources.displayMetrics.widthPixels
    private val mTargets = mutableListOf<CustomTarget<Bitmap>>()

    companion object {
        const val TAG = "fly/BatchBitmapView"
        const val ROW_SIZE = 16 //一行多少個bitmap
        const val IMAGE_SIZE = 80 //每個小格子圖片的尺寸
    }

    fun setRowBitmapData(rows: ArrayList<MainActivity.MyData>?, position: Int) {
        Log.d(TAG, "setRowBitmapData $position")

        mData.clear()

        Log.d(TAG, "mTargets.size=${mTargets.size}")
        mTargets.forEach {
            Glide.with(context).clear(it) //如果不清楚,會發(fā)生有些圖錯放位置。
        }
        mTargets.clear() //mTargets上下滑動列表會越來越大,清空,一直保持ROW_SIZE.

        rows?.forEachIndexed { index, myData ->
            val target = object : CustomTarget<Bitmap>() {
                override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                    val bean = DataBean(resource)
                    mData.add(bean)
                    postInvalidate()
                }

                override fun onLoadCleared(placeholder: Drawable?) {

                }
            }

            Glide.with(context)
                .asBitmap()
                .centerCrop()
                .override(IMAGE_SIZE)
                .load(myData.path)
                .into(target)

            mTargets.add(target)
        }
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        setMeasuredDimension(mScreenWidth, IMAGE_SIZE)
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)

        mData.forEachIndexed { index, dataBean ->
            canvas.save()
            var left = (mScreenWidth / ROW_SIZE) * index
            canvas.drawBitmap(dataBean.bitmap, left.toFloat(), 0f, null)
            canvas.restore()
        }
    }

    data class DataBean(val bitmap: Bitmap)
}

上面每一行加載16個bitmap繪圖,速度很快,因為是canvas直接繪圖。但是,如果使用下文的方式:

Android LinearLayout dynamic add child ImageView,Glide load,kotlin_zhangphil的博客-CSDN博客文章瀏覽閱讀645次?!敬a】Android Paging 3,kotlin(1)在實際的開發(fā)中,雖然Glide解決了快速加載圖片的問題,但還有一個問題懸而未決:比如用戶的頭像,往往用戶的頭像是從服務(wù)器端讀出的一個普通矩形圖片,但是現(xiàn)在的設(shè)計一般要求在APP端的用戶頭像顯示成圓形頭像,那么此時雖然Glide可以加載,但加載出來的是一個矩形,如果要Glide_android 毛玻璃圓角。??《Android圖片加載與緩存開源框架:Android Glide》Android Glide是一個開源的圖片加載和緩存處理的第三方框架。https://blog.csdn.net/zhangphil/article/details/132080406即每一行先初始化一個水平的線性布局,然后逐個添加16個ImageView,對比發(fā)現(xiàn)明顯卡頓,因為是以ViewGroup的方式布局?jǐn)[放子view形成View。

?

?

?

Android Glide CustomTarget ,kotlin-CSDN博客文章瀏覽閱讀1.4k次?!敬a】Android Paging 3,kotlin(1)在實際的開發(fā)中,雖然Glide解決了快速加載圖片的問題,但還有一個問題懸而未決:比如用戶的頭像,往往用戶的頭像是從服務(wù)器端讀出的一個普通矩形圖片,但是現(xiàn)在的設(shè)計一般要求在APP端的用戶頭像顯示成圓形頭像,那么此時雖然Glide可以加載,但加載出來的是一個矩形,如果要Glide_android 毛玻璃圓角。??《Android圖片加載與緩存開源框架:Android Glide》Android Glide是一個開源的圖片加載和緩存處理的第三方框架。https://blog.csdn.net/zhangphil/article/details/131661819

?

到了這里,關(guān)于Android Glide自定義AppCompatImageView切分成若干小格子,每個小格子onDraw繪制Bitmap,Kotlin(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 2023-05-11:給你一個 m x n 的二進(jìn)制矩陣 grid, 每個格子要么為 0 (空)要么為 1 (被占據(jù)), 給你郵票的尺寸為 stampHeight x stampWidth。 我們想將

    2023-05-11:給你一個 m x n 的二進(jìn)制矩陣 grid, 每個格子要么為 0 (空)要么為 1 (被占據(jù)), 給你郵票的尺寸為 stampHeight x stampWidth。 我們想將

    2023-05-11:給你一個 m x n 的二進(jìn)制矩陣 grid, 每個格子要么為 0 (空)要么為 1 (被占據(jù)), 給你郵票的尺寸為 stampHeight x stampWidth。 我們想將郵票貼進(jìn)二進(jìn)制矩陣中,且滿足以下 限制 和 要求 : 覆蓋所有空格子,不覆蓋任何被占據(jù)的格子, 可以放入任意數(shù)目的郵票,郵票

    2024年02月09日
    瀏覽(21)
  • Android Glide

    Android Glide

    1.引入glide 2.AndroidManifest.xml 中添加需要的權(quán)限 如果你計劃從 URL 或一個網(wǎng)絡(luò)連接中加載數(shù)據(jù),你需要加 INTERNET 和 ACCESS_NETWORK_STATE 權(quán)限到你的 AndroidManifest.xml 中,要從本地文件夾或DCIM或圖庫中加載圖片,你將需要添加 READ_EXTERNAL_STORAGE 權(quán)限。 3. 基本使用 Glide.with([fragment/Conte

    2024年04月12日
    瀏覽(34)
  • Android---Glide的基本使用

    Android---Glide的基本使用

    目錄 Glide 基本使用 Glide 進(jìn)階? Glide 是一個快速高效的 Android 圖片加載庫,可以自動加載網(wǎng)絡(luò)、本地文件,app 資源中的圖片,注重于平滑的滾動。 Glide 第一次加載一張圖片后,就會自動幫我們把這張圖片加入到內(nèi)存中進(jìn)行管理。 步驟1 :導(dǎo)入 Glide 依賴 步驟2: 最簡單使用 wi

    2024年02月03日
    瀏覽(19)
  • Android——Glide的多樣使用

    Android——Glide的多樣使用

    沒有任何附加效果顯示,請求結(jié)果返回之后,直接在圖片容器中顯示 當(dāng)網(wǎng)絡(luò)請求過多或者業(yè)務(wù)繁忙時,Glide返回可能會有一定延遲,此空窗期就會不顯示任何東西,通過 placeholder 可添加一張占位符,在數(shù)據(jù)未返回之前,顯示一張默認(rèn)圖片 在開發(fā)需求中,往往會需要將某些圖

    2023年04月24日
    瀏覽(32)
  • [Android]圖片加載庫Glide

    [Android]圖片加載庫Glide

    目錄 Glide的介紹 ?Glide的基本使用? ?指定圖片的格式 Glide占位符 ?指定圖片的大小 ?過渡動畫 圖片變換 Generated API Glide的介紹 Glide是一個快速高效的Android圖片加載庫,可以自動加載網(wǎng)絡(luò),本地文件,app資源中的文件,注重于平滑的滾動。 開源地址:https://github.com/bumptech/gl

    2024年02月08日
    瀏覽(31)
  • Android使用glide時報錯“ ????: ???????Fragment Glide.with(getContext()) ^ ?????and”

    Android使用glide時報錯“ ????: ???????Fragment Glide.with(getContext()) ^ ?????and”

    在 gradle.properties 中添加下面兩行代碼 即可

    2024年02月08日
    瀏覽(18)
  • Android 加載gif圖,Glide

    個人中心 DownLoad Android 可以使用 Glide、Picasso、Fresco 等第三方庫來加載 gif 圖。 以 Glide 為例,可以按照以下步驟加載 gif 圖: 1. 在 build.gradle 文件中添加 Glide 的依賴: ``` dependencies { ? ? implementation \\\'com.github.bumptech.glide:glide:4.12.0\\\' ? ? annotationProcessor \\\'com.github.bumptech.glide:compil

    2024年02月14日
    瀏覽(21)
  • Android之Glide圖片框架分析

    Android之Glide圖片框架分析

    使用簡單,鏈?zhǔn)秸{(diào)用,API簡潔。with、load、into三步走就可以加載圖片 生命周期自動綁定,根據(jù)綁定的Activity或者Fragment生命周期管理圖片請求 高效處理Bitmap。支持bitmap的復(fù)用和主動回收,減少系統(tǒng)回收壓力。 占用內(nèi)存?。ㄊ褂肦GB565的格式),RGB8888每個像素占的字節(jié)會比RGB5

    2024年02月13日
    瀏覽(19)
  • Android Glide CustomTarget ,kotlin

    Android Glide CustomTarget ,kotlin ? ? ? android Glide CustomViewTarget,java_zhangphil的博客-CSDN博客 【代碼】android Glide CustomViewTarget,java。 https://blog.csdn.net/zhangphil/article/details/129493334 Android Glide預(yù)加載preload ,kotlin_zhangphil的博客-CSDN博客 【代碼】Android Paging 3,kotlin(1)在實際的開發(fā)中,雖然G

    2024年02月16日
    瀏覽(28)
  • Android 面試之Glide做了哪些優(yōu)化?

    Android 面試之Glide做了哪些優(yōu)化?

    Glide 可以說是最常用的圖片加載框架了, Glide 鏈?zhǔn)秸{(diào)用使用方便,性能上也可以滿足大多數(shù)場景的使用, Glide 源碼與原理也是面試中的??汀?但是 Glide 的源碼內(nèi)容比較多,想要學(xué)習(xí)它的源碼往往千頭萬緒,一時抓不住重點. 本文以 Glide 做了哪些優(yōu)化為切入點,介紹與學(xué)習(xí)

    2024年02月11日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包