圆形ListView(半圆上的项目)

Jil*_*rta 9 android listview

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

在此输入图像描述

有一个相关的帖子,但它已关闭.

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

Eth*_*han 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我要做的第二件事是覆盖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();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以从我的Gist下载完整的源代码.

初始状态 观点的初始状态 滚动状态 滚动到底部

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