リストアイテムを半円上に配置した円形リストビューを作成しようとしています。次のようになります。
関連記事がありましたが、クローズしました。
独自の Circular Custom ListView を作成しましたが、正常に動作しますが、問題は、画像に示されているようにリスト項目を半円に配置できないことです。いろいろやってみましたがだめで、やり方がわかりません。
そのため、これをデモするサンプル アプリを作成したとき、2 つのことを行う必要がありました。
まず、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;
}
}
私がしなければならなかった 2 番目のことは、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から完全なソースをダウンロードできます。
初期状態 スクロール状態
ご覧のとおり、私の数学は少しずれています...放物線と円を使用しているので、変更する必要があります。