Рисование и анимация в андроиде

58
8

Сначала

это больше вопрос об анимации, чем конкретное кодирование проблемы. я должен заполнить широкие штрихи, оставленные исследованием, которое я делал.


что я пытаюсь сделать:


активность должна загружаться только с видимой кнопкой toggle. при нажатии кнопки png будет анимироваться в определенном положении относительно переключателя. кроме того, другая кнопка будет сдвигаться с экрана и сдвигаться, если/когда снова нажата кнопка переключения.


что я не могу понять:


Я могу нарисовать изображение, но только через xml. создание образа и установка фонового программного обеспечения ничего не делает.


когда я рисую из xml, я не могу переместить изображение при нажатии кнопки toggle, как я хочу. когда я вызываю getPositionOnScreen(), я получаю нулевой указатель, даже если он может видеть, что я ссылаюсь на изображение, описанное как в xml, так и в коде.


Я вызываю getPositionOnScreen, потому что через xml у меня есть изображение, расположенное за переключателем, чтобы оно не было видно, пока кнопка не была нажата, и изображение не начнет двигаться. идея заключается в том, что с разными размерами экрана я не буду точно знать, где находится представление до времени выполнения. getPostionOnScreen позволяет мне получить координаты изображения, поэтому я знаю, где он был позиционирован. когда у меня есть начальная позиция, можно сказать, чтобы он "двигался вверх" на экране из-за переключателя, просто добавляя к x или y до тех пор, пока я не захочу.


это код для рисования изображения (вставленный в метод onCreate).


image= (ImageView) new ImageView(this);
image.setImageResource(R.drawable.pic);

это код, который я использую для анимации. когда кнопка нажата, он вызывает этот метод в представлении от слушателя.


private void activate(){

int loc[] = new int [2];
image.getLocationOnScreen(loc);
int fromXDelta = loc[0];
int fromYDelta = loc[1];
int toYDelta = fromYDelta;
int toXDelta = fromXDelta - 30;

TranslateAnimation translateAnimation = new TranslateAnimation
(-fromXDelta, -toXDelta, -fromYDelta, -toYDelta);
translateAnimation.setDuration(500);
translateAnimation.setFillEnabled(true);

image.startAnimation(translateAnimation);

}


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

спросил(а) 2020-04-04T00:11:44+03:00 5 месяцев, 4 недели назад
1
Решение
57

Хорошо, первая точка. Если вы создаете новый объект ImageView таким образом (используя new), вам не нужно бросать его в "ImageView manually as it already is a fresh'n new ImageView".


Теперь, чтобы вы поняли, почему ваш ImageView не отображался при объявлении его так, как вы изначально устали (т.е. создаете новый объект), потому что у вас, скорее всего, был параметр setContentView() методов в вашем методе onCreate() установите R.layout.main (ваш файл main.xml, содержащий ваш макет). Теперь это просто не будет работать, поскольку Android не будет знать, что вы пытаетесь сделать с созданным ImageView, поскольку вы никогда его не используете. Yo может либо определить ViewGroup (LinearLayout, AbsoluteLayout и т.д.) В Java по коду и назначить им все ваши виджеты (ImageView, ToggleButton и т.д.), А затем установить его как параметр setContentView(), чтобы отобразить их или вы можете пойти проще и определить все, что вам нужно, в вашем XML файле, содержащем ваш макет, как я.


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ToggleButton
android:id="@+id/trigger"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOn="Active"
android:textOff="Stopped"
android:checked="false"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"/>
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/trigger"
android:visibility="invisible"/>
</RelativeLayout>

Теперь в Java вам просто нужно получить ссылки (или указатели) на ваши виджеты, чтобы вы могли использовать их для всех видов неприятных вещей, таких как анимация.

Вот мой код Java.


import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class VeryCoolAnimation extends Activity {

ImageView image = null;
ToggleButton trigger = null;
Context ctx = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

ctx = getApplicationContext();

trigger = (ToggleButton) findViewById(R.id.trigger);
image = (ImageView) findViewById(R.id.image);

image.setImageResource(R.drawable.icon);

trigger.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if(isChecked) {
animate();
}
}
});
}

private void animate() {
int loc[] = new int[2];
image.getLocationOnScreen(loc);
// Just used to print out the images position
Toast.makeText(ctx, "Position on screen: x = " + loc[0] + " y = " + loc[1], 5000).show();
int fromXDelta = loc[0];
int fromYDelta = loc[1];
int toYDelta = fromYDelta + 50;
int toXDelta = fromXDelta + 80;

TranslateAnimation translateAnimation = new TranslateAnimation(
fromXDelta, toXDelta, fromYDelta, toYDelta);
translateAnimation.setDuration(800);
translateAnimation.setFillEnabled(true);

image.startAnimation(translateAnimation);
image.setVisibility(View.INVISIBLE);
}
}


Я не совсем уверен, что это тот эффект, на который вы стремились, но вы можете, конечно, настроить его в соответствии с вашими потребностями, поскольку у вас есть полностью функциональный кусок кода.


Удачи.

ответил(а) 2020-04-04T00:26:21.296552+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема