获取View的视图以及ViewPager使用

获取View的视图几种方法:

保存一个父布局 则 他的子控件 子View也是会显示的

一、创建一个新的空Bitmap,然后再根据它来创建一个Canvas,最后调用View的draw方法将View画到Canvas上


    public Bitmap createViewBitmap(View v) {
        Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(),
                Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        v.layout(0, 0, v.getWidth(), v.getHeight());  
        v.draw(canvas);
        return bitmap;

若view没有显示出来,则要去获取宽高,更完整的参考:https://blog.csdn.net/dongbaoming/article/details/54172801

性能优化:
1 若对生成的图片没有透明度分量的要求,则可以将生成图片改为RGB565 而非ARGB8888


二、View的DrawingCache 方法
但是要求该View必须显示过 否则拿不到长宽

/**
     * 获取 View 的缓存视图
     *
     * @param view
     * @return
     */
    private fun getCacheBitmapFromView(view: View): Bitmap? {
        view.isDrawingCacheEnabled = true
        view.buildDrawingCache(true)  //启用DrawingCache并创建位图
        val drawingCache = view.drawingCache // getDrawingCache
        val bitmap: Bitmap?
        if (drawingCache != null) {
            //创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收
            bitmap = Bitmap.createBitmap(drawingCache)
            view.isDrawingCacheEnabled = false //禁用DrawingCahce否则会影响性能
            view.destroyDrawingCache()
        } else {
            bitmap = null
        }
        return bitmap
    }

默认 getDrawingCache 得到的bitmap 为 ARGB8888

问题: getDrawingCache 返回的为空
原因: 1 View没有显示到界面上,获取的 VIew的宽高为空



alibaba viewPager库:https://github.com/alibaba/UltraViewPager

一、build.gradle

//gradle
    implementation('com.alibaba.android:ultraviewpager:1.0.7.7@aar') {
        transitive = true
    }

二、加载UltraPager和Adapter

        val ultraViewPager = findViewById<View>(R.id.ultra_viewpager) as UltraViewPager
        // 有水平和垂直方向
        ultraViewPager.setScrollMode(UltraViewPager.ScrollMode.HORIZONTAL)
        // 设置多屏显示 1.0f为单屏 如0.5则是左右两边都留图片的一半显示
        ultraViewPager.setMultiScreen(1.0f)
        // 设置 转换的动态效果,有两种
        ultraViewPager.setPageTransformer(true, UltraDepthScaleTransformer())
        //设定页面循环播放
        ultraViewPager.setInfiniteLoop(false)
        //设定页面自动切换  间隔2秒
        //mUltraViewPager.setAutoScroll(2000)
        // UltraViewPager的高度会自动调整到child view的高度
        //ultraViewPager.setAutoMeasureHeight(true)
        // 设置后会以此宽高比调整child view的高度
        //ultraViewPager.setItemRatio(1.0)
        // 以设定的宽高比来绘制UltraViewPager
        //ultraViewPager.setRatio(1.5f)


/** initialize UltraPagerAdapter,and add child view to UltraViewPager */
        val adapter = UltraPagerAdapter(this)
        ultraViewPager.adapter = adapter

三、UltraPagerAdapter类:

这里主要 实现了
加载3个自定义的layout
设置布局的点击监听
更改某个TextView的字体
获取View的缓存视图

class UltraPagerAdapter(private val context: Context) : PagerAdapter(), View.OnClickListener {

    private val TAG = "UltraPagerAdapter"

    companion object {
        @JvmField
        var viewCacheBitmap :Bitmap ?=null
    }
    override fun getCount(): Int {
        return 3
    }

    override fun isViewFromObject(view: View, obj: Any): Boolean {
        return view === obj
    }
    /** 加载3个自定义的layout */
    override fun instantiateItem(container: ViewGroup, position: Int): Any {
        val layoutRelativeLayout01 = LayoutInflater.from(container.context).inflate(R.layout.template01, null)
        val layoutRelativeLayout02 = LayoutInflater.from(container.context).inflate(R.layout.template02, null)
        val layoutRelativeLayout03 = LayoutInflater.from(container.context).inflate(R.layout.template03, null)

        val relativeLayout01 = layoutRelativeLayout01.findViewById(R.id.template_01) as RelativeLayout
        val relativeLayout02 = layoutRelativeLayout02.findViewById(R.id.template_02) as RelativeLayout
        val relativeLayout03 = layoutRelativeLayout03.findViewById(R.id.template_03) as RelativeLayout

        val tvDay01 = layoutRelativeLayout01.findViewById(R.id.tv_template01_day) as TextView
        val tvDay02 = layoutRelativeLayout02.findViewById(R.id.tv_template02_day) as TextView
        val tvDay03 = layoutRelativeLayout03.findViewById(R.id.tv_template03_day) as TextView

        /** 设置字体样式 */
        val textFont = Typeface.createFromAsset(context.assets, "fonts/CharlemagneStd-Bold.otf")
        if (textFont != null) {
            tvDay01.typeface = textFont
            tvDay02.typeface = textFont
            tvDay03.typeface = textFont
        } else {
            Logger.t(TAG).e("字体库不存在")
        }

        // 设置监听
        relativeLayout01.setOnClickListener(this)
        relativeLayout02.setOnClickListener(this)
        relativeLayout03.setOnClickListener(this)
        /** 加载界面 */
        when (position) {
            0 -> {
                container.addView(relativeLayout01)
                return relativeLayout01
            }
            1 -> {
                container.addView(relativeLayout02)
                return relativeLayout02
            }
            2 -> {
                container.addView(relativeLayout03)
                return relativeLayout03
            }
        }
        return relativeLayout01
    }

    override fun destroyItem(container: ViewGroup, position: Int, obj: Any) {
        val view = obj as RelativeLayout
        container.removeView(view)
    }

    override fun onClick(view: View?) {
        if (view != null) {
            viewCacheBitmap = getCacheBitmapFromView(view)
            Logger.t(TAG).e("viewCacheBitmap width" + viewCacheBitmap?.width
                    + "  viewCacheBitmap height" + viewCacheBitmap?.height)
        }else{
            Logger.t(TAG).e("View is null")
        }

        val sharedPicDialog = SharedPicDialog(context)
        sharedPicDialog.show()

    }


    /**
     * 获取 View 的缓存视图
     *
     * @param view
     * @return
     */
    private fun getCacheBitmapFromView(view: View): Bitmap? {
        val drawingCacheEnabled = true
        view.isDrawingCacheEnabled = drawingCacheEnabled
        view.buildDrawingCache(drawingCacheEnabled)
        val drawingCache = view.drawingCache
        val bitmap: Bitmap?
        if (drawingCache != null) {
            bitmap = Bitmap.createBitmap(drawingCache)
            view.isDrawingCacheEnabled = false
        } else {
            bitmap = null
        }
        return bitmap
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_37577039/article/details/80868529
今日推荐