SORU
5 ŞUBAT 2014, ÇARŞAMBA


Liste görünümü öğesi kaydırma animasyon ("UİKit Dynamics" -gibi)

Bir kaydırma gerçekleştiğinde ListView öğeleri canlandırmak için çalışıyorum. Daha spesifik olarak, iOS 7 gözetleyin uygulamasından kaydırma animasyonlar taklit etmeye çalışıyorum. Benzer bir örnek online buldum:

Açıklığa kavuşturmak için, "" Kullanıcı kaydırma öğeleri, yeni bir öğe eklendiğinde animasyon değil etkisi. akıcı bir şekilde hareket elde etmek için çalışıyorum Yaptım çalıştı değiştirmek için Görünümlerde benim BaseAdapter ve baktım içine AbsListView kaynağına bakın Eğer yapabilseydim bir şekilde takın AccelerateInterpolator bir yerde olacağını ayarlamak beraberlik koordinatları gönderilen çocukların Görüşlerini (varsa bile nasıl AbsListView tasarlanmış). Herhangi bir ilerleme yapamıyoruz şu ana kadar oldum.

Herkes bu davranışı çoğaltmak için nasıl herhangi bir fikir var mı?


Googling ile yardımcı olmak için kayıt için: bu denir"UİKit Dynamics"ios.

How to replicate Messages bouncing bubbles in iOS 7

Yerleşik son iOS sürümleri için. Ancak hala biraz zor. (2014) Bu yazı herkes kopyalar:widely copied article Şaşırtıcı, UİKit Dynamics, yalnızca Apple'ın "koleksiyonunu görmek" değil, Apple'ın "table view" yani tüm iOS debs olmasından, dönüştürmek şeyler tablosunu görüntülemek için "koleksiyonunu görmek"

Kütüphane Herkesin bir başlangıç noktası olarak kullanıyorBPXLFlowLayoutbu kişi oldukça fazla çatlak beri iphone metin mesajları app hissediyorum kopyalama. Eğer Android taşımaya olsaydı aslında, orada parametreler aynı fikir almak için kullanabilirsiniz sanırım. Android fone benim toplama fark ettim BİLGİNİZE, HTC Telefonlar bu etki, onların UI var. Umarım yardımcı olur. Kayalar Android!

CEVAP
8 ŞUBAT 2014, CUMARTESİ


Bu uygulama oldukça iyi çalışıyor. Orada biraz titrek olsa da, muhtemelen nedeniyle değişmiş endeksleri zaman bağdaştırıcı Ekle yeni görüntüler için üst veya alt..O olabilir belki çözüldü izleyerek değişiklikleri ağaç ve vites endeksleri anında..

public class ElasticListView extends GridView implements AbsListView.OnScrollListener,      View.OnTouchListener {

private static int SCROLLING_UP = 1;
private static int SCROLLING_DOWN = 2;

private int mScrollState;
private int mScrollDirection;
private int mTouchedIndex;

private View mTouchedView;

private int mScrollOffset;
private int mStartScrollOffset;

private boolean mAnimate;

private HashMap<View, ViewPropertyAnimator> animatedItems;


public ElasticListView(Context context) {
    super(context);
    init();
}

public ElasticListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public ElasticListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

private void init() {
    mScrollState = SCROLL_STATE_IDLE;
    mScrollDirection = 0;
    mStartScrollOffset = -1;
    mTouchedIndex = Integer.MAX_VALUE;
    mAnimate = true;
    animatedItems = new HashMap<>();
    this.setOnTouchListener(this);
    this.setOnScrollListener(this);

}


@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    if (mScrollState != scrollState) {
        mScrollState = scrollState;
        mAnimate = true;

    }
    if (scrollState == SCROLL_STATE_IDLE) {
        mStartScrollOffset = Integer.MAX_VALUE;
        mAnimate = true;
        startAnimations();
    }

}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

    if (mScrollState == SCROLL_STATE_TOUCH_SCROLL) {

        if (mStartScrollOffset == Integer.MAX_VALUE) {
            mTouchedView = getChildAt(mTouchedIndex - getPositionForView(getChildAt(0)));
            if (mTouchedView == null) return;

            mStartScrollOffset = mTouchedView.getTop();
        } else if (mTouchedView == null) return;

        mScrollOffset = mTouchedView.getTop() - mStartScrollOffset;
        int tmpScrollDirection;
        if (mScrollOffset > 0) {

            tmpScrollDirection = SCROLLING_UP;

        } else {
            tmpScrollDirection = SCROLLING_DOWN;
        }

        if (mScrollDirection != tmpScrollDirection) {
            startAnimations();
            mScrollDirection = tmpScrollDirection;
        }


        if (Math.abs(mScrollOffset) > 200) {
            mAnimate = false;
            startAnimations();
        }
        Log.d("test", "direction:"   (mScrollDirection == SCROLLING_UP ? "up" : "down")   ", scrollOffset:"   mScrollOffset   ", toucheId:"   mTouchedIndex   ", fvisible:"   firstVisibleItem   ", "  
            "visibleItemCount:"   visibleItemCount   ", "  
            "totalCount:"   totalItemCount);
        int indexOfLastAnimatedItem = mScrollDirection == SCROLLING_DOWN ?
            getPositionForView(getChildAt(0))   getChildCount() :
            getPositionForView(getChildAt(0));

        //check for bounds
        if (indexOfLastAnimatedItem >= getChildCount()) {
            indexOfLastAnimatedItem = getChildCount() - 1;
        } else if (indexOfLastAnimatedItem < 0) {
            indexOfLastAnimatedItem = 0;
        }

        if (mScrollDirection == SCROLLING_DOWN) {
            setAnimationForScrollingDown(mTouchedIndex - getPositionForView(getChildAt(0)), indexOfLastAnimatedItem, firstVisibleItem);
        } else {
            setAnimationForScrollingUp(mTouchedIndex - getPositionForView(getChildAt(0)), indexOfLastAnimatedItem, firstVisibleItem);
        }
        if (Math.abs(mScrollOffset) > 200) {
            mAnimate = false;
            startAnimations();
            mTouchedView = null;
            mScrollDirection = 0;
            mStartScrollOffset = -1;
            mTouchedIndex = Integer.MAX_VALUE;
            mAnimate = true;
        }
    }
}

private void startAnimations() {
    for (ViewPropertyAnimator animator : animatedItems.values()) {
        animator.start();
    }
    animatedItems.clear();
}

private void setAnimationForScrollingDown(int indexOfTouchedChild, int indexOflastAnimatedChild, int firstVisibleIndex) {
    for (int i = indexOfTouchedChild   1; i <= indexOflastAnimatedChild; i  ) {
        View v = getChildAt(i);
        v.setTranslationY((-1f * mScrollOffset));
        if (!animatedItems.containsKey(v)) {
            animatedItems.put(v, v.animate().translationY(0).setDuration(300).setStartDelay(50 * i));
        }

    }
}

private void setAnimationForScrollingUp(int indexOfTouchedChild, int indexOflastAnimatedChild, int firstVisibleIndex) {
    for (int i = indexOfTouchedChild - 1; i > 0; i--) {
        View v = getChildAt(i);

        v.setTranslationY((-1 * mScrollOffset));
        if (!animatedItems.containsKey(v)) {
            animatedItems.put(v, v.animate().translationY(0).setDuration(300).setStartDelay(50 * (indexOfTouchedChild - i)));
        }

    }
}


@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            Rect rect = new Rect();
            int childCount = getChildCount();
            int[] listViewCoords = new int[2];
            getLocationOnScreen(listViewCoords);
            int x = (int)event.getRawX() - listViewCoords[0];
            int y = (int)event.getRawY() - listViewCoords[1];
            View child;
            for (int i = 0; i < childCount; i  ) {
                child = getChildAt(i);
                child.getHitRect(rect);
                if (rect.contains(x, y)) {
                    mTouchedIndex = getPositionForView(child); 
                    break;
                }
            }
            return false;

    }
    return false;

}

}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Autocar

    Autocar

    11 Mart 2006
  • BgirlNilaya

    BgirlNilaya

    29 EKİM 2008
  • LounaTutorials

    LounaTutoria

    10 EYLÜL 2009