Скорост на анимацията на SlidingDrawer

Нов съм в програмирането с Android и препълването на стека и трябва да намаля скоростта на анимацията на SlidingDrawer в моето приложение.

Вече съм подкласирал SlidingDrawer така:

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.SlidingDrawer;

public class WrappingSlidingDrawer extends SlidingDrawer {

public WrappingSlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    int orientation = attrs.getAttributeIntValue("android", "orientation", ORIENTATION_VERTICAL);
    mTopOffset = attrs.getAttributeIntValue("android", "topOffset", 0);
    mVertical = (orientation == SlidingDrawer.ORIENTATION_VERTICAL);
}

public WrappingSlidingDrawer(Context context, AttributeSet attrs) {
    super(context, attrs);

    int orientation = attrs.getAttributeIntValue("android", "orientation", ORIENTATION_VERTICAL);
    mTopOffset = attrs.getAttributeIntValue("android", "topOffset", 0);
    mVertical = (orientation == SlidingDrawer.ORIENTATION_VERTICAL);
}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
    int widthSpecSize =  MeasureSpec.getSize(widthMeasureSpec);

    int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
    int heightSpecSize =  MeasureSpec.getSize(heightMeasureSpec);

    if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) {
        throw new RuntimeException("SlidingDrawer cannot have UNSPECIFIED dimensions");
    }

    final View handle = getHandle();
    final View content = getContent();
    measureChild(handle, widthMeasureSpec, heightMeasureSpec);

    if (mVertical) {
        int height = heightSpecSize - handle.getMeasuredHeight() - mTopOffset;
        content.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, heightSpecMode));
        heightSpecSize = handle.getMeasuredHeight() + mTopOffset + content.getMeasuredHeight();
        widthSpecSize = content.getMeasuredWidth();
        if (handle.getMeasuredWidth() > widthSpecSize) widthSpecSize = handle.getMeasuredWidth();
    }
    else {
        int width = widthSpecSize - handle.getMeasuredWidth() - mTopOffset;
        getContent().measure(MeasureSpec.makeMeasureSpec(width, widthSpecMode), heightMeasureSpec);
        widthSpecSize = handle.getMeasuredWidth() + mTopOffset + content.getMeasuredWidth();
        heightSpecSize = content.getMeasuredHeight();
        if (handle.getMeasuredHeight() > heightSpecSize) heightSpecSize = handle.getMeasuredHeight();
    }

    setMeasuredDimension(widthSpecSize, heightSpecSize);
}

private boolean mVertical;
private int mTopOffset;

}

Намерих тази връзка: Как да променя скоростта на анимацията на SlidingDrawer, и казва, че мога да намеря алтернативна реализация или да копирам източника и да го променя.

Създадох SlidingDrawer.java в моя собствен проект и поставих кода от тук, но има грешки. Има няколко реда, които препращат към R.styleable.SlidingDrawer, напр.

TypedArray a = context.obtainStyledAttributes(attrs,
            R.styleable.SlidingDrawer, defStyle, 0);

които Eclipse не може да разреши.

Има и четири членски променливи (mTop, mBottom, mLeft, mRight), които Eclipse не може да разреши.

Как да накарам Eclipse да намери тези ресурси/променливи? След това ще мога да редактирам някои променливи, за да доведа до по-бавна анимация, нали?


person Justin Lewis    schedule 30.07.2011    source източник
comment
Хей, можеш ли да предоставиш окончателния потребителски клас и как да го добавиш в xml, защото ми дава грешка InflateException.   -  person abhishek    schedule 03.05.2013


Отговори (1)


Вярвам, че R.styleable е премахнат от sdk, но можете да напишете свой собствен, нещо подобно трябва да работи

В папката със стойности създайте xml файл

<?xml version="1.0" encoding="UTF-8"?>
<resources>
<declare-styleable name="MySlider"> 
        <attr name = "SlidingDrawer_orientation"  format="integer"/>
        <attr name = "SlidingDrawer_bottomOffset" format = "dimension"/>
        <attr name = "SlidingDrawer_topOffset" format = "dimension"/>
        <attr name = "SlidingDrawer_allowSingleTap" format = "boolean"/>
        <attr name = "SlidingDrawer_animateOnClick" format = "boolean"/>
        <attr name = "SlidingDrawer_handle" format = "reference"/>
        <attr name = "SlidingDrawer_content" format = "reference"/>
    </declare-styleable>
</resources>

След това в класа на слайдера можете да препратите към xml файла

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MySlider, defStyle, 0);

int orientation = a.getInt(R.styleable.MySlider_SlidingDrawer_orientation, ORIENTATION_VERTICAL);
//...etc. ...

Също така разширявам класа slidingdrawer и това работи за мен.

person triggs    schedule 31.07.2011
comment
Много благодаря! Това реши проблема ми, сега мога да продължа с разширяването на класа. - person Justin Lewis; 01.08.2011
comment
Имате предвид mTop, mBottom и т.н. просто използвайте техните гетери - getTop(), getBottom() и т.н. - person triggs; 25.01.2013