рисование и анимация в Android - PullRequest
1 голос
/ 06 ноября 2010

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

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

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

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

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

когда я рисую из xml, я не могу переместить изображение, когда нажата кнопка переключения, как я хочу.когда я вызываю 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);

 }

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

1 Ответ

1 голос
/ 06 ноября 2010

Хорошо, первая точка. Если вы создаете новый объект 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);
    }
}

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

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...