Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
263 views
in Technique[技术] by (71.8m points)

java - Android: Vertical ListView with overlapped rows

How to create listview like this in android 1.6 or 2 (because of renderscript, which works only in 3 or later, but I need list to work on almost all androids):

enter image description here

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I used Camera.setTranslate(x, 0, z) in drawChild, where changed x position for rotation virtualization and z for overlaping. Then there was problem with overlapping, because last item was on top and first on bottom layer. So, in onCreate() method called this.setChildrenDrawingOrderEnabled(true) and overriden protected int getChildDrawingOrder (int childCount, int i) {} where I could change order for middle and later rows. This idea was given by Renard, who suggested me in other my post about almost same thing here.

My getChildDrawingOrder(int, int) implementation to get overlapping I need:

@Override
protected int getChildDrawingOrder (int childCount, int i) {
    int centerChild = 0;
    //find center row
    if ((childCount % 2) == 0) { //even childCount number
        centerChild = childCount / 2; // if childCount 8 (actualy 0 - 7), then 4 and 4-1 = 3 is in centre.      
        int otherCenterChild = centerChild - 1;
        //Which more in center?
        View child = this.getChildAt(centerChild);
        final int top = child.getTop();
        final int bottom = child.getBottom();
        //if this row goes through center then this
        final int absParentCenterY = getTop() + getHeight() / 2;
        //Log.i("even", i + " from " + (childCount - 1) + ", while centerChild = " + centerChild);
        if ((top < absParentCenterY) && (bottom > absParentCenterY)) {
            //this child is in center line, so it is last
            //centerChild is in center, no need to change
        } else {
            centerChild = otherCenterChild;
        }
    }
    else {//not even - done
        centerChild = childCount / 2;
        //Log.i("not even", i + " from " + (childCount - 1) + ", while centerChild = " + centerChild);
    }

    int rez = i;
    //find drawIndex by centerChild
    if (i > centerChild) {
        //below center
        rez = (childCount - 1) - i + centerChild;
    } else if (i == centerChild) {
        //center row
        //draw it last
        rez = childCount - 1;
    } else {
        //above center - draw as always
        // i < centerChild
        rez = i;
    }
    //Log.i("return", "" + rez);
    return rez;

}

I hope this post will help someone in future

Screenshot is actually almost the same as I mentioned in my question. I used alpha, so overlayed items is a little bit see-through:

enter image description here


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...