Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何制作圆形滚动列表视图?-安卓_Android_List_Listview_View_Geometry - Fatal编程技术网

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

Android 如何制作圆形滚动列表视图?-安卓,android,list,listview,view,geometry,Android,List,Listview,View,Geometry,(写完后,我意识到这个问题太大了,大多数人看不懂。如果你能相信我的话,为什么我发布了一个看似重复的问题,请转到最后一部分!) 上面的链接把你带到几乎完全相同的问题,以及我们都想做什么,(我,这里还有那个链接上的人)。。。是实现一个真正的圆形列表视图-见图片。正是这样 我为什么又问这个问题? 这个问题已经过去近6个月了,所以我不可能希望联系那些回答/提问的人(我试过) 此外,问题的答案给出了正确的答案-完全有效。 然而,它需要API 11+。。 考虑到我现有应用程序中约30%的用户群低于API

(写完后,我意识到这个问题太大了,大多数人看不懂。如果你能相信我的话,为什么我发布了一个看似重复的问题,请转到最后一部分!)

上面的链接把你带到几乎完全相同的问题,以及我们都想做什么,(我,这里还有那个链接上的人)。。。是实现一个真正的圆形列表视图-见图片。正是这样

我为什么又问这个问题? 这个问题已经过去近6个月了,所以我不可能希望联系那些回答/提问的人(我试过)

此外,问题的答案给出了正确的答案-完全有效。 然而,它需要API 11+。。 考虑到我现有应用程序中约30%的用户群低于API 11,我需要为至少API 8+创建这个精确的listview

简短解释 答案中的人在做什么:

以下是自定义文本视图:

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();
    }
}
基本上,他是在抛物线上找出点,在那里放置一个列表项,然后继续,检查这个文本视图的当前位置,将它与其他文本视图(它后面的文本视图)进行比较,然后相应地放置它们

非常简单。。。我的问题其实没那么大

问题是:

这是个大问题,但我的问题只有一句话:

float indent = getIndent(getY());
getY();函数至少需要API 11+。 API 8+是否有相同的函数

还有,有没有更好的方法来实现这一点?(如果您费心阅读代码:-D) 如果你知道任何其他性感的自定义列表视图,请张贴在这里

如有任何意见,将不胜感激。 谢谢大家!

getTop()怎么样? getY()相当于translationY属性加上当前top属性, 假设您的目标API低于11,那么translationY应该保持不变 由于setTrnaslationY函数也是API11+,所以您可以使用它

float indent = getIndent(getY());