繁体   English   中英

如何制作圆形滚动列表视图? -安卓

[英]How to make a Circular Shaped scrolling listview ? - Android

(写完之后,我意识到这个问题对大多数人来说太大了。如果您能信服我为什么要发布一个看似重复的问题,请继续阅读最后一部分!)

圆形ListView(半圆上的项目)

在此处输入图片说明

上面的链接将您带到几乎完全相同的问题,以及我们俩都想做的事情,(我,这里和那个链接上的人)...实现了字面上的圆形ListView-参见图片。 就是这样

为什么我再问这个问题? 这个问题已经有将近6个月的时间了,所以我不可能希望与回答/询问的人联系(我尝试过)。

此外,问题的答案给出了正确的答案-完全正常。 但是,它需要API 11 + ..考虑到现有应用程序用户的约30%在API 11以下,因此我需要至少为API 8 +创建此确切的列表视图...

简短说明该答案中的人正在做什么:

以下是自定义textview:

public class MyView extends TextView {

    private static final int MAX_INDENT = 300;
    private static final String TAG = MyView.class.getSimpleName();

    public MyView(Context context) {
        super(context);
    }

    public void onDraw(Canvas canvas){
        canvas.save();
        float indent = getIndent(getY());
        canvas.translate(indent, 0);
        super.onDraw(canvas);
        canvas.restore();
    }

    public float getIndent(float distance){
        float x_vertex = MAX_INDENT;
        DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
        float y_vertex = displayMetrics.heightPixels / 2 / displayMetrics.density;
        double a = ( 0 - x_vertex ) / ( Math.pow(( 0 - y_vertex), 2) ) ;
        float indent = (float) (a * Math.pow((distance - y_vertex), 2) + x_vertex);
        return indent;
    }
}

这是列表视图:

public class HalfCircleListView extends ListView implements AbsListView.OnScrollListener {
    public HalfCircleListView(Context context) {
        super(context);
        setOnScrollListener(this);
    }


    @Override
    public void onScrollStateChanged(AbsListView absListView, int i) {
        //Ignored
    }

    @Override
    public void onScroll(AbsListView absListView, int i, int i2, int i3) {
        absListView.invalidateViews();
    }
}

基本上,他要找出抛物线上的点,在那儿放置一个列表项,然后继续,检查此textview的当前位置,将其与其他textview(在其后的)进行比较,然后将其相应放置。

很简单...我的问题实际上并不大。

这是问题所在:

public void onDraw(Canvas canvas){
    canvas.save();
    float indent = getIndent(getY());
    //Part of the magic happens here too
    canvas.translate(indent, 0);
    super.onDraw(canvas);
    canvas.restore();
}

问题很大,但我的问题只有一行:

float indent = getIndent(getY());

getY(); 函数需要最低API 11+。 API 8 +是否有相同的功能?

另外,有没有更好的方法来实现呢? (如果您不愿阅读代码:-D)如果您知道任何其他性感的自定义列表视图,请在此处发布。

任何输入将不胜感激。 谢谢 !

getTop()怎么样? getY()等同于translationY属性加上当前的top属性,假设您的目标API低于11,则由于setTrnaslationY函数也是API 11+的事实,translationY应该保持不变。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM