2021年2月27日土曜日

ShapeDrawable + BitmapShader で elevation の影を出す

背景(background)の Drawable が ShapeDrawable の場合、elevation を指定すると影がでます。(1番目)
一方、BitmapDrawable では elevation を指定しても影がでません。(2番目)
しかし背景(background)の Drawable が BitmapDrawable でも ViewOutlineProvider を使うと影が出るようになります。(4番目)
  1. val provider = object : ViewOutlineProvider() {  
  2.     override fun getOutline(view: View, outline: Outline) {  
  3.         val radius = 32 * resources.displayMetrics.density  
  4.         outline.setRoundRect(00, view.width, view.height, radius)  
  5.     }  
  6. }  
  7.   
  8. findViewById<View>(R.id.frameLayout4).apply {  
  9.     outlineProvider = provider  
  10.     clipToOutline = true  
  11. }  
ViewOutlineProvider を使わずに、ShapeDrawable と BitmapShader でも影がでるようにすることができます。(2番目)
  1. val r = 16 * resources.displayMetrics.density  
  2.   
  3. val shapeDrawable = ShapeDrawable(  
  4.   RoundRectShape(floatArrayOf(r, r, r, r, r, r, r, r), nullnull)  
  5. )  
  6.   
  7. val bitmap = BitmapFactory.decodeResource(resources, R.drawable.image_round)  
  8.   
  9. shapeDrawable.shaderFactory = object: ShapeDrawable.ShaderFactory() {  
  10.     override fun resize(width: Int, height: Int): Shader {  
  11.         val bmp = bitmap.scale(width, height, false)  
  12.         return BitmapShader(bmp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)  
  13.     }  
  14. }  
  15.   
  16. findViewById<View>(R.id.frameLayout2).background = shapeDrawable  



0 件のコメント:

コメントを投稿