【问题标题】:How to make a Circular Shaped scrolling listview ? - Android如何制作圆形滚动列表视图? - 安卓
【发布时间】:2013-09-20 11:34:22
【问题描述】:

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

Circular ListView (Items on Half Circle)

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

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

此外,问题的答案给出了正确的答案 - 完全有效。 但是,它需要 API 11 + .. 考虑到我现有应用程序的用户群中有大约 30% 低于 API 11,我需要为至少 API 8 + 创建这个确切的列表视图 ...

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

下面是自定义文本视图:

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

基本上他是在找出抛物线上的点,在那里放置一个列表项,然后继续检查这个文本视图的当前位置,将它与其他文本视图(它之后的那些)进行比较,然后相应地放置它们。

非常简单......我的问题实际上并没有那么大。

问题出在这里:

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

巨大的 as* 问题,但我的问题只是一行:

float indent = getIndent(getY());

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

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

我们将不胜感激。 谢谢!

【问题讨论】:

    标签: android list listview view geometry


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2016-08-02
      • 2013-01-14
      • 1970-01-01
      • 2019-09-22
      相关资源
      最近更新 更多