Java 使用按钮Kotlin/AndroidStudio更改canva绘图颜色
我正在学习柯特林语作为我的第二语言,我遇到了一些麻烦。 我想做的是: 我的练习是在单击按钮时更改屏幕上球的颜色。我的教授给出的答案是不够的,而且没有执行力。我知道如果a可以调用Balls.draw()方法会更容易,但我不能,因为画布没有明确定义。我尝试过很多其他代码,但都没有改变 这是我所有的文件: Activity_main.xml:Java 使用按钮Kotlin/AndroidStudio更改canva绘图颜色,java,android,kotlin,canvas,Java,Android,Kotlin,Canvas,我正在学习柯特林语作为我的第二语言,我遇到了一些麻烦。 我想做的是: 我的练习是在单击按钮时更改屏幕上球的颜色。我的教授给出的答案是不够的,而且没有执行力。我知道如果a可以调用Balls.draw()方法会更容易,但我不能,因为画布没有明确定义。我尝试过很多其他代码,但都没有改变 这是我所有的文件: Activity_main.xml: <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http:/
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="115dp"
android:onClick="onClick"
android:text="Start"
app:layout_constraintBottom_toTopOf="@+id/vMain"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.example.up2.DrawingView
android:id="@+id/vMain"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="1dp"
android:layout_marginEnd="1dp"
android:layout_marginBottom="1dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn" />
</androidx.constraintlayout.widget.ConstraintLayout>
Balls.kt:
package com.example.up2
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import java.util.*
class Balls(x:Float, y: Float, val diametre : Float) {
val random = Random()
val paint = Paint()
val r = RectF(x, y, x+diametre, y+diametre)
val color = Color.argb(random.nextInt(256),random.nextInt(256),random.nextInt(256),random.nextInt(256))
fun draw(canvas: Canvas?){
paint.color = color
canvas?.drawOval(r, paint)
}
}
您的主要问题是在main活动中设置了
drawingView.b1.paint.color
,但在Balls.kt.draw()中,您将其设置回paint.color=color
然后,在对视图进行更改时,应使其无效()
同时,我对您的代码进行了一点重构,我将其发布在下面。activity_main.xml中唯一的变化是删除了Buttons onClick属性
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val drawingView = findViewById<DrawingView>(R.id.vMain).apply {
setWillNotDraw(false)
invalidate()
}
btn.setOnClickListener{
drawingView.randomizeBallColors()
}
}
}
class DrawingView @JvmOverloads constructor (context: Context, attributes: AttributeSet? = null, defStyleAttr: Int = 0): SurfaceView(context, attributes,defStyleAttr) {
private val backgroundPaint = Paint()
private val random = Random()
private val b1 = Balls(random.nextFloat()*500, random.nextFloat()*1000, random.nextFloat()*500)
private val b2 = Balls(random.nextFloat()*500, random.nextFloat()*1000, random.nextFloat()*500)
private val b3 = Balls(random.nextFloat()*500, random.nextFloat()*1000, random.nextFloat()*500)
fun randomizeBallColors()
{
b1.color = (Color.argb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256),Random().nextInt(256)))
b2.color = (Color.argb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256),Random().nextInt(256)))
b3.color = (Color.argb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256),Random().nextInt(256)))
invalidate()
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
backgroundPaint.color = Color.WHITE
canvas?.drawRect(0F, 0F, width.toFloat(), height.toFloat(), backgroundPaint)
b1.draw(canvas)
b2.draw(canvas)
b3.draw(canvas)
}
}
class Balls(x:Float, y: Float, diametre : Float) {
private val random = Random()
private val paint = Paint()
private val r = RectF(x, y, x+diametre, y+diametre)
var color = Color.argb(random.nextInt(256),random.nextInt(256),random.nextInt(256),random.nextInt(256))
fun draw(canvas: Canvas?){
paint.color = color
canvas?.drawOval(r, paint)
}
}
class MainActivity:Activity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val drawingView=findViewById(R.id.vMain)。应用{
setWillNotDraw(假)
使无效
}
btn.setOnClickListener{
drawingView.randomizeBallColors()
}
}
}
类DrawingView@JVM重载构造函数(上下文:上下文,属性:AttributeSet?=null,defStyleAttr:Int=0):SurfaceView(上下文,属性,defStyleAttr){
private val backgroundPaint=Paint()
private val random=random()
private val b1=Balls(random.nextFloat()*500,random.nextFloat()*1000,random.nextFloat()*500)
private val b2=Balls(random.nextFloat()*500,random.nextFloat()*1000,random.nextFloat()*500)
private val b3=Balls(random.nextFloat()*500,random.nextFloat()*1000,random.nextFloat()*500)
有趣的随机性BallColor()
{
b1.color=(color.argb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256),Random().nextInt(256)))
b2.color=(color.argb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256),Random().nextInt(256)))
b3.color=(color.argb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256),Random().nextInt(256)))
使无效
}
覆盖onDraw(画布:画布?){
super.onDraw(画布)
backgroundPaint.color=color.WHITE
canvas?.drawRect(0F,0F,width.toFloat(),height.toFloat(),backgroundPaint)
b1.绘制(画布)
b2.绘制(画布)
b3.绘制(画布)
}
}
类球(x:浮球,y:浮球,直径:浮球){
private val random=random()
私有val paint=paint()
私有值r=RectF(x,y,x+直径,y+直径)
var color=color.argb(random.nextInt(256)、random.nextInt(256)、random.nextInt(256)、random.nextInt(256))
趣味绘画(画布:画布?){
颜色
帆布?.Draw椭圆形(r,油漆)
}
}
它工作得很好。谢谢大家!@布伦诺费雷拉,不客气!如果答案对你有帮助,你可以将其标记为接受。谢谢
package com.example.up2
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import java.util.*
class Balls(x:Float, y: Float, val diametre : Float) {
val random = Random()
val paint = Paint()
val r = RectF(x, y, x+diametre, y+diametre)
val color = Color.argb(random.nextInt(256),random.nextInt(256),random.nextInt(256),random.nextInt(256))
fun draw(canvas: Canvas?){
paint.color = color
canvas?.drawOval(r, paint)
}
}
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val drawingView = findViewById<DrawingView>(R.id.vMain).apply {
setWillNotDraw(false)
invalidate()
}
btn.setOnClickListener{
drawingView.randomizeBallColors()
}
}
}
class DrawingView @JvmOverloads constructor (context: Context, attributes: AttributeSet? = null, defStyleAttr: Int = 0): SurfaceView(context, attributes,defStyleAttr) {
private val backgroundPaint = Paint()
private val random = Random()
private val b1 = Balls(random.nextFloat()*500, random.nextFloat()*1000, random.nextFloat()*500)
private val b2 = Balls(random.nextFloat()*500, random.nextFloat()*1000, random.nextFloat()*500)
private val b3 = Balls(random.nextFloat()*500, random.nextFloat()*1000, random.nextFloat()*500)
fun randomizeBallColors()
{
b1.color = (Color.argb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256),Random().nextInt(256)))
b2.color = (Color.argb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256),Random().nextInt(256)))
b3.color = (Color.argb(Random().nextInt(256),Random().nextInt(256),Random().nextInt(256),Random().nextInt(256)))
invalidate()
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
backgroundPaint.color = Color.WHITE
canvas?.drawRect(0F, 0F, width.toFloat(), height.toFloat(), backgroundPaint)
b1.draw(canvas)
b2.draw(canvas)
b3.draw(canvas)
}
}
class Balls(x:Float, y: Float, diametre : Float) {
private val random = Random()
private val paint = Paint()
private val r = RectF(x, y, x+diametre, y+diametre)
var color = Color.argb(random.nextInt(256),random.nextInt(256),random.nextInt(256),random.nextInt(256))
fun draw(canvas: Canvas?){
paint.color = color
canvas?.drawOval(r, paint)
}
}