Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用按钮Kotlin/AndroidStudio更改canva绘图颜色_Java_Android_Kotlin_Canvas - Fatal编程技术网

Java 使用按钮Kotlin/AndroidStudio更改canva绘图颜色

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:/

我正在学习柯特林语作为我的第二语言,我遇到了一些麻烦。 我想做的是: 我的练习是在单击按钮时更改屏幕上球的颜色。我的教授给出的答案是不够的,而且没有执行力。我知道如果a可以调用Balls.draw()方法会更容易,但我不能,因为画布没有明确定义。我尝试过很多其他代码,但都没有改变

这是我所有的文件:

Activity_main.xml:

<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)
    }
}