Android: указать начальную позицию анимации кругового раскрытия?
В настоящее время у меня есть круговая анимация, которая начинается с правой стороны панели инструментов. Я хочу, чтобы начальный центр круга начинался со значка "поиск", из-за которого я изо всех сил пытался найти ответ. Я пытался изменить cx
а также xy
ценности и неудачно. Любая помощь приветствуется.
final Toolbar search_bar = (Toolbar) findViewById(R.id.search_toolbar);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int cx = search_bar.getWidth();
int cy = search_bar.getHeight()/2;
float finalRadius = (float) Math.hypot(cx, cy);
Animator anim =
ViewAnimationUtils.createCircularReveal(search_bar, cx, cy, 0, finalRadius);
search_bar.setVisibility(View.VISIBLE);
anim.start();
}
3 ответа
Попробуй это:
public void startCircularReveal() {
final View view = findViewById(R.id.linearLayout);
final View startView = findViewById(R.id.button_container);
int cx = (startView.getLeft() + startView.getRight()) / 2;
int cy = (startView.getTop() + startView.getBottom()) / 2;
view.setBackgroundColor(Color.parseColor("#6FA6FF"));
int finalRadius = Math.max(cy , view.getHeight() - cy);
Animator anim = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius);
anim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
anim.setDuration(200);
view.setVisibility(View.VISIBLE);
anim.start();
}
Измените представление на представление, которое вы хотите отобразить поверх него (обычно это корневое представление), и запустите представление для представления "поиск" в виде значков, а onAnimationEnd сделайте все, что вы захотите, после завершения раскрытия.
ОБНОВИТЬ
Если показ не находится на верху ваших представлений, есть небольшая хитрость, чтобы исправить это, добавив это представление внизу вашего макета.
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/custom_theme_color"
android:orientation="vertical"
android:visibility="invisible">
</LinearLayout>
убедитесь, что представление "view" установлено на id этого макета
final View view = findViewById(R.id.linearLayout);
По сути, я сделал добавление LinearLayout и установил его ширину и высоту, совпадающие с match_parent, так что это представление превыше всего, и это то место, где будет отображаться раскрытие, и чтобы оно не влияло на ваш Макет Я установил видимость невидимым, и установил его видимым в самом начале раскрытия:
view.setVisibility (View.VISIBLE);
Я надеюсь, что это помогает.
revealView(listview, RssFragment.this.ll);
public void revealView(View toBeRevealed, View frame)
{
if (!ViewCompat.isAttachedToWindow(toBeRevealed))
{
return;
}
if (VERSION.SDK_INT >= 21)
{
Animator anim = ViewAnimationUtils.createCircularReveal(toBeRevealed, (frame.getLeft() + frame.getRight()) / 2, (frame.getTop() + frame.getBottom()) / 2, 0.0f, (float) Math.max(frame.getWidth(), frame.getHeight()));
toBeRevealed.setVisibility(View.VISIBLE);
anim.start();
return;
}
toBeRevealed.setVisibility(View.VISIBLE);
}
Вы можете попробовать это
enter i nt cx = search_bar.getRight() * 5 / 6; int cy = (search_bar.getTop() + search_bar.getBottom()) / 2;