Android View animation - низкая производительность на больших экранах - PullRequest
4 голосов
/ 26 декабря 2011

Я разработал игру-головоломку. В моей игре у меня есть несколько пользовательских представлений, которые вложены в FrameLayout, как слои. Каждый вид отображает растровое изображение. Самым большим растровым изображением является игровое поле, и оно занимает около 2/3 размера экрана. Есть также фоновое изображение под FrameLayout.

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

Все это отлично работает на небольших экранах, но пользователи сообщали о проблемах с производительностью на Galaxy Tab - заметное отставание перед запуском анимации и сама анимация не плавная. (Размер растрового изображения игрового поля на этих экранах составляет около 600 * 600 пикселей)

Вот мой макет:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootFrame"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/backgroundImageLayer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:src="@drawable/background"
        android:scaleType="fitXY"/>

    <FrameLayout android:id="@+id/gameFrame"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

            <com.mygame.BoardView
            android:id="@+id/boardLayer"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>

            <com.mygame.SomeObjectView
            android:id="@+id/someObjectLayer"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>

            <com.mygame.SomeOtherObjectView
            android:id="@+id/someOtherObjectLayer"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>

        </FrameLayout>    

</FrameLayout>

А вот и мой класс BoardView.

public class BoardView extends View {

Bitmap b;
int x;
int y;

public BoardView(Context context, AttributeSet attrs) {
    super(context, attrs);
    // calculate size of the bitmap
    b = Bitmap.createBitmap(sizeX, sizeY, Bitmap.Config.ARGB_4444);
    createMyBitmap();
}

private void createMyBitmap() {
    Canvas c;
    c = new Canvas(b);
    // lots of c.drawRect() and c.drawLine() , using opaque and semi-transparent colors
}

@Override
public void onDraw(Canvas canvas) {
    canvas.drawBitmap(b, x, y, null);
}
}

И фрагмент, где я делаю анимацию, все довольно просто:

AnimationRotate anim1=new AnimationRotate(startAngle,endAngle,centerX,centerY);
anim1.setDuration(500);
anim1.setInterpolator(newDecelerateInterpolator());
startAnimation(anim1);

Так что же вызывает лаги с анимацией вида и как я могу это исправить? Мой подход правильный, или, может быть, я должен использовать SurfaceView или рамочную анимацию или что-то еще?

Ответы [ 4 ]

11 голосов
/ 26 декабря 2011

Включить аппаратное ускорение, если вы еще этого не сделали.Система рендеринга макетов была изменена в версии 3.0+ для повышения производительности на этих больших экранах путем перемещения большинства программного рендеринга в аппаратное обеспечение.Вам нужно больше узнать об этом здесь

Есть определенные вещи, которые не будут работать с аппаратным ускорением, но из того, что вы показали, у вас все хорошо.Самый простой способ включить это - добавить это в манифест вашего приложения и цель 3.0 или выше (например, для сборки вы можете поддерживать более низкие уровни API)

<application android:hardwareAccelerated="true"
...
>
3 голосов
/ 22 марта 2012

Я читал, что установка следующих свойств может помочь повысить производительность:

this.setAnimationCacheEnabled(true);
this.setDrawingCacheEnabled(true);
1 голос
/ 26 декабря 2011

Как я знаю, все команды 2D-графики очень медленные и продолжают замедляться, когда экран становится больше.Я бы посоветовал настроить 3D-Surfaceview, чтобы поместить ваши изображения в виде текстур на квадраторы и визуализировать их.Это будет намного быстрее, чем с 2D-Gfx.

0 голосов
/ 02 сентября 2014

вы читаете с здесь

View.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);
animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        view.setLayerType(View.LAYER_TYPE_NONE, null);
    }
});
animator.start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...