获取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
}
}