圆形ListView(半圆上的项目)

时间:2013-04-27 14:34:00

标签: android listview

我正在尝试使用排列在半圆上的列表项创建循环ListView。看起来应该是这样的:

enter image description here

有一个related post,但已关闭。

我制作了自己的圆形自定义ListView并且它工作正常,但我的问题是我无法安排列表项目半圈方式,因为它显示在图像上。我尝试了几件事,但它没用,我不知道怎么做。

4 个答案:

答案 0 :(得分:18)

因此,当我制作示例应用程序演示时,我必须做两件事。

首先,在我的自定义视图上编辑onDraw(Canvas)。这可以是任何视图,为简单起见,我将其设为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;
    }
}

我要做的第二件事是覆盖ListView类,让它实现OnScrollListener并调用setOnScrollListener(this);。现在我可以滚动列表,它遵循我放在视图中的等式。

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();
    }
}

您可以从我的Gist下载完整的来源。

初始状态 Initial State of the View 滚动状态 Scrolled to the bottom

正如你可以看到我的数学有点偏离...我使用抛物线与圆形,所以必须改变。

答案 1 :(得分:1)

您可以为适配器的getView()中返回的每个视图增加/减少左边距。因此,例如,对于视图的前半部分,您可以增加每个项目的边距,例如20像素(int margin = index * 20),并相应地减少后半部分视图。

当然,这需要进行大量微调才能看起来像圆形列表,但我认为你明白这一点。

答案 2 :(得分:1)

如果可能,我会尝试使用现有的径向菜单小部件。 This one声称支持半圆形放射状菜单。我不确定this one是否有效。

答案 3 :(得分:0)

经过一些更加光彩照人后,我找到了解决方案 它像普通的ListView一样经过相对优化和配置。

以下是主要代码段:

<强> CircularListView.java

AttributeError at /
module 'apps.release_news' has no attribute 'urls'
Request Method: GET
Request URL:    http://127.0.0.1:8000/
Django Version: 1.8.7
Exception Type: AttributeError
Exception Value:    
module 'apps.release_news' has no attribute 'urls'
Exception Location: C:\software\development\PythonProject\DemoGuitarProject\DemoGuitarProject\urls.py in <module>, line 24
Python Executable:  C:\software\development\python3.5\python.exe
Python Version: 3.5.0
Python Path:    
['C:\\software\\development\\PythonProject\\DemoGuitarProject',
 'C:\\software\\development\\PythonProject\\DemoGuitarProject',
 'C:\\software\\development\\python3.5\\python35.zip',
 'C:\\software\\development\\python3.5\\DLLs',
 'C:\\software\\development\\python3.5\\lib',
 'C:\\software\\development\\python3.5',
 'C:\\software\\development\\python3.5\\lib\\site-packages']
Server time:    Wed, 2 Dec 2015 15:49:02 +0800

有关更多说明,您还可以查看我的博文,并对此发表评论。您可以下载eclipse的示例应用程序 我的博客是:
http://androidpantiii.blogspot.in/2015/11/half-circular-list-view-there-were.html