Я хочу непрерывно вращать анимацию

#android #android-studio #android-layout

#Android #android-studio #android-макет

Вопрос:

Я хочу создать анимацию, где меняется на x, когда вы нажимаете на плавающую панель действий, а x меняется на , когда вы нажимаете снова.Но вот результат работы кода.введите здесь описание изображения

  • -> x -> Я хотел бы написать код так, чтобы его можно было изменять каждый раз при нажатии на него. Буду признателен за любую помощь.

fab_rotate.xml

 <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">

    <rotate
        android:duration="500"
        android:pivotY="50%"
        android:pivotX="50%"
        android:toDegrees="45"
        android:fromDegrees="0"/>

</set>
 

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:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity">






<com.google.android.material.floatingactionbutton.FloatingActionButton

    android:id="@ id/fab_sub1"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_above="@ id/fab_sub2"

    android:layout_alignParentRight="true"

    android:layout_marginBottom="15dp"

    android:layout_marginRight="20dp"

    android:backgroundTint="#ffffff"

    android:visibility="invisible"

    app:borderWidth="0dp"

    app:fabSize="normal" />



<com.google.android.material.floatingactionbutton.FloatingActionButton

    android:id="@ id/fab_sub2"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_above="@ id/fab_main"

    android:layout_alignParentRight="true"

    android:layout_marginBottom="15dp"

    android:layout_marginRight="20dp"

    android:backgroundTint="#ffffff"

    android:visibility="invisible"

    app:borderWidth="0dp"

    app:fabSize="normal" />



<com.google.android.material.floatingactionbutton.FloatingActionButton

    android:id="@ id/fab_main"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_alignParentBottom="true"

    android:layout_alignParentRight="true"

    android:layout_marginBottom="20dp"

    android:layout_marginRight="20dp"

    android:backgroundTint="#009688"

    android:src="@drawable/ic_add"

    app:borderWidth="0dp"

    app:fabSize="normal"

    />



</RelativeLayout>
 

MainActivity.java

 import android.content.Context;

import android.os.Bundle;



import android.view.View;

import android.view.animation.Animation;

import android.view.animation.AnimationUtils;

import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.google.android.material.floatingactionbutton.FloatingActionButton;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Context mContext;



private FloatingActionButton fab_main, fab_sub1, fab_sub2;

private Animation fab_open, fab_close, fab_rotate;

private boolean isFabOpen = false;



@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    mContext = getApplicationContext();



    fab_open = AnimationUtils.loadAnimation(mContext, R.anim.fab_open);

    fab_close = AnimationUtils.loadAnimation(mContext, R.anim.fab_close);

    fab_rotate = AnimationUtils.loadAnimation(mContext, R.anim.fab_rotate);



    fab_main = (FloatingActionButton) findViewById(R.id.fab_main);

    fab_sub1 = (FloatingActionButton) findViewById(R.id.fab_sub1);

    fab_sub2 = (FloatingActionButton) findViewById(R.id.fab_sub2);



    fab_main.setOnClickListener(this);

    fab_sub1.setOnClickListener(this);

    fab_sub2.setOnClickListener(this);

}



@Override

public void onClick(View v) {

    switch (v.getId()) {

        case R.id.fab_main:

            toggleFab();
            fab_main.startAnimation(fab_rotate);

            break;

        case R.id.fab_sub1:

            toggleFab();

            Toast.makeText(this, "Camera Open-!", Toast.LENGTH_SHORT).show();

            break;



        case R.id.fab_sub2:

            toggleFab();

            Toast.makeText(this, "Map Open-!", Toast.LENGTH_SHORT).show();

            break;

    }

}



private void toggleFab() {

    if (isFabOpen) {

        fab_sub1.startAnimation(fab_close);

        fab_sub2.startAnimation(fab_close);

        fab_sub1.setClickable(false);

        fab_sub2.setClickable(false);

        isFabOpen = false;

    } else {

        fab_sub1.startAnimation(fab_open);

        fab_sub2.startAnimation(fab_open);

        fab_sub1.setClickable(true);

        fab_sub2.setClickable(true);

        isFabOpen = true;

    }

}

}
 

Ответ №1:

Я вижу, вы пытаетесь добиться чего-то подобного: https://github.com/kelmer44/fabmenus/blob/master/art/demo.gif

Если да, то в вашем текущем коде вы можете добавить fab_normal анимацию, чтобы вернуть значок fab в исходное положение.

Прямо сейчас fab_rotate вы просто поворачиваете ее на 45 градусов каждый раз. Вы не возвращаете ее к 0.

Вот почему вам нужно fab_normal.xml следующее:

 <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">

    <rotate
        android:duration="500"
        android:pivotY="50%"
        android:pivotX="50%"
        android:toDegrees="0"
        android:fromDegrees="45"/>

</set>
 

Обратите внимание, что fromDegrees toDegrees значения how amp; меняются местами друг с другом.

А затем в вашем MainActivity использовании это как:

 import android.content.Context;

import android.os.Bundle;



import android.view.View;

import android.view.animation.Animation;

import android.view.animation.AnimationUtils;

import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.google.android.material.floatingactionbutton.FloatingActionButton;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Context mContext;



    private FloatingActionButton fab_main, fab_sub1, fab_sub2;

    private Animation fab_open, fab_close, fab_rotate,fab_normal;

    private boolean isFabOpen = false;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mContext = getApplicationContext();



        fab_open = AnimationUtils.loadAnimation(mContext, R.anim.fab_open);

        fab_close = AnimationUtils.loadAnimation(mContext, R.anim.fab_close);

        fab_rotate = AnimationUtils.loadAnimation(mContext, R.anim.fab_rotate);

        fab_normal = AnimationUtils.loadAnimation(mContext, R.anim.fab_normal);



        fab_main = (FloatingActionButton) findViewById(R.id.fab_main);

        fab_sub1 = (FloatingActionButton) findViewById(R.id.fab_sub1);

        fab_sub2 = (FloatingActionButton) findViewById(R.id.fab_sub2);



        fab_main.setOnClickListener(this);

        fab_sub1.setOnClickListener(this);

        fab_sub2.setOnClickListener(this);

    }



    @Override

    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.fab_main:

                fab_main.startAnimation(isFabOpen ? fab_normal : fab_rotate);
                toggleFab();

                break;

            case R.id.fab_sub1:

                toggleFab();

                Toast.makeText(this, "Camera Open-!", Toast.LENGTH_SHORT).show();

                break;



            case R.id.fab_sub2:

                toggleFab();

                Toast.makeText(this, "Map Open-!", Toast.LENGTH_SHORT).show();

                break;

        }

    }



    private void toggleFab() {

        if (isFabOpen) {

            fab_sub1.startAnimation(fab_close);

            fab_sub2.startAnimation(fab_close);

            fab_sub1.setClickable(false);

            fab_sub2.setClickable(false);

            isFabOpen = false;

        } else {

            fab_sub1.startAnimation(fab_open);

            fab_sub2.startAnimation(fab_open);

            fab_sub1.setClickable(true);

            fab_sub2.setClickable(true);

            isFabOpen = true;

        }

    }

}
 

Если вам нужно более продвинутое использование, посмотрите этот проект: https://github.com/kelmer44/fabmenus