如何在自定义视图中获取按钮位置

时间:2019-07-01 19:20:44

标签: java animation button graphics

我创建了一个自定义视图,该视图将位于相对布局的顶部。这样,我可以在同一视图上绘制画布。我想这样做是因为我想制作一个从播放按钮发出的自定义发光动画。这是我尝试在Android上实现的示例:https://youtu.be/XzXBdN6-1Gc

但是我无法在onDraw()函数中使用按钮位置。由于按钮是在相对布局中绘制的,因此它们无法将其位置传递到自定义视图,在该视图中,onDraw()在单独的类文件中被调用。有人知道如何获取自定义视图的按钮位置,以便我知道在使用其他设备且按钮位置发生更改的情况下在哪里绘制发光的动画吗?

我已经尝试在包含按钮位置值的字符串资源文件中创建一个字符串变量。我也尝试过使用customView.draw(canvas)在MainActivity的onCreate()中创建的画布绘制自定义视图。最后,我尝试将按钮添加到activity_main.xml文件中,但是CustomView是它自己的标签,因此我无法在其中插入任何内容。

package com.example.*;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
public class CustomView extends View {

    public CustomView(Context context) {
        super(context);
    }

    public void onDraw(Canvas canvas){
    Paint paint = new Paint();
    Canvas canvas = new Canvas();
    paint.setColor(getResources().getColor(R.id.white);
    canvas.drawCircle(20, 20 , 20, paint);
    }

    public CustomView(Context context, @androidx.annotation.Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomView(Context context, @androidx.annotation.Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public CustomView(Context context, @androidx.annotation.Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }
}

我无法在onDraw()方法中获取Button位置变量,这样我才能知道在画布上绘制动画的位置。

我的MainActivity:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CustomView customView = new CustomView(this);

        playButton = findViewById(R.id.play);

        playButton.post(new Runnable() {
             @Override
             public void run() {
                 playx = playButton.getX();
                 playy = playButton.getY();
                 System.out.println("play x = " + playx + " play y = " + playy);
             }
        });

...

}

用于布局的activity_main.xml资源文件:

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout 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:id="@+id/background"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#000000"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:elevation="4dp"
            android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/play"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_above="@id/seekbar"
        android:alpha="1"
        android:layout_centerHorizontal="true"
        android:layout_gravity="center"
        android:background="@android:drawable/ic_media_play" />

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/pause"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_above="@id/seekbar"
        android:layout_gravity="end"
        android:layout_toEndOf="@id/play"
        android:background="@android:drawable/ic_media_next" />

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/stop"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_above="@id/seekbar"
        android:layout_toStartOf="@id/play"
        android:background="@android:drawable/ic_media_previous"
        android:shadowColor="@color/white"
        android:shadowRadius="50" />

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/aButton"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_above="@+id/seekbar"
        android:layout_alignStart="@id/stop"
        android:layout_alignParentStart="true"
        android:layout_marginTop="?attr/actionBarSize"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="5dp"
        android:fontFamily="sans-serif"
        android:text="A" />

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/bButton"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_above="@+id/seekbar"
        android:layout_toRightOf="@id/aButton"
        android:layout_alignParentRight="false"
        android:layout_marginBottom="5dp"
        android:fontFamily="sans-serif"
        android:text="B" />

    <com.example.macyg.androidmediaplayer.CustomView
        android:layout_width="wrap_content"
        android:layout_height="150dp"
        android:layout_alignParentBottom="true"
        android:background="#FFFFF"/>

</RelativeLayout>

0 个答案:

没有答案