#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