如何在android中为自定义视图创建setter和getter
Posted
技术标签:
【中文标题】如何在android中为自定义视图创建setter和getter【英文标题】:How to create setter and getter for a custom view in android 【发布时间】:2020-07-07 06:15:59 【问题描述】:我正在构建一个自定义视图,该视图扩展视图并为图像获取参数。到目前为止,我一直在实现从可绘制对象和服务器(通过字符串 URL)绘制图像。
class CustomView(context: Context, attrSet: AttributeSet) : View(context)
private var typedArray = context.obtainStyledAttributes(attrSet, R.styleable.CustomView)
private var viewColor = typedArray.getColor(R.styleable.CustomView_viewColor, Color.WHITE)
private var viewSize = typedArray.getDimensionPixelSize(R.styleable.CustomView_viewSize, 200)
private var rect = Rect(50, 50, this.left+viewSize, this.top+viewSize)
var viewImage = typedArray.getResourceId(R.styleable.CustomView_viewImage, -1)
var imageBitmap:Bitmap?=null
var imageString = typedArray.getString(R.styleable.CustomView_imageString)
val radius = 100f
var cx = 0f
var cy = 0f
private var paint = Paint(Paint.ANTI_ALIAS_FLAG)
private var circlePaint = Paint(Paint.ANTI_ALIAS_FLAG)
private var labelPaint = Paint(Paint.ANTI_ALIAS_FLAG)
init
paint.color = viewColor
circlePaint.color = Color.parseColor("#000000")
labelPaint.color = Color.parseColor("#000000")
typedArray.recycle()
try
val iStream = URL(imageString)
imageBitmap = BitmapFactory.decodeResource(resources, viewImage) ?: BitmapFactory.decodeStream(iStream.openStream())
catch (e:Exception)
Log.i("Image", "Kindly provide a valid image")
override fun onDraw(canvas: Canvas?)
if(cx == 0f || cy == 0f)
cx = (width/2).toFloat()
cy = (height/2).toFloat()
canvas?.drawRect(rect, paint)
canvas?.drawCircle(cx, cy, radius, circlePaint)
if (imageBitmap != null)
canvas?.drawBitmap(imageBitmap!!, 50f, 100f, null)
我还希望能够在运行时在 xml 之外更改此值,例如在活动或片段中以使其动态化。
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val url =
"https://dyl80ryjxr1ke.cloudfront.net/external_assets/hero_examples/hair_beach_v1785392215/original.jpeg"
customView.imageString = url
【问题讨论】:
【参考方案1】:在 CustomView 类中,将 init 函数中的行设置为如下所示的设置函数:
class CustomView(context: Context, attrSet: AttributeSet) : View(context)
//setups
init()
setupFunction(imageString)
fun setupFunction(url: String)
paint.color = viewColor
circlePaint.color = Color.parseColor("#000000")
labelPaint.color = Color.parseColor("#000000")
typedArray.recycle()
try
val iStream = URL(imageString)
imageBitmap = BitmapFactory.decodeResource(resources, viewImage)
?: BitmapFactory.decodeStream(iStream.openStream())
catch (e: Exception)
Log.i("Image", "Kindly provide a valid image")
onDraw()
现在 setupFunction() 可以在您每次需要时从您的 Fragment 或 Activity 中调用:
customView.setupFunction(url)
视图将根据您的需要启动。
【讨论】:
我试过这个并得到Attempt to invoke virtual method 'void com.decagon.calabashtest.CustomView.setupFunc(java.lang.String)' on a null object reference
你在哪里调用它?因为这告诉你customView尚未创建。
是的。我认为我没有在超类中包含属性集。当我这样做时,错误消失了,但图像没有改变。
ok 我认为重绘将通过在 setup 函数中调用 draw 函数来实现。我已经更新了答案
感谢您的帮助@Bita 我使用了 postInvalidate() 并且它有效。我不认为 onDraw() 会因为我必须将画布传递给它。非常感谢。以上是关于如何在android中为自定义视图创建setter和getter的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Bundle 中为自定义表格视图单元格类加载 NIB
如何在 thrift-compiler 中为自定义语言创建自己的 thrift 语言模板?
我们如何在 Hive 中为自定义 Writable 类型编写自定义 ObjectInspector?