(写完之后,我意识到这个问题太大了,大多数人都无法阅读。如果你能说出我为什么发布一个看似重复的问题,请转到最后一部分!)
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;
}
}
这是listview:
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();
}
}
基本上他正在计算抛物线上的点,将列表项放在那里,然后前进,检查此文本视图的当前位置,将其与其他文本视图(之后的文本视图)进行比较,然后相应地放置它们。 p>
非常简单......我的问题实际上并不是那么大。
以下是问题:
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) 如果您知道任何其他性感的自定义列表视图,请在此处发布。
任何输入将不胜感激。 谢谢!
答案 0 :(得分:0)
getTop()怎么样? getY()相当于translationY属性加上当前的top属性, 假设您的目标是低于11的API,则translationY应保持不变 由于setTrnaslationY函数也是API 11+,所以你有它......