Androidで次のアクティビティ遷移を実行しようとしています。
1では、通常のListViewが表示されます。ここで(2)、ListView要素に指を置き、指を左にスライドすると、指が置かれている要素を除いて、他のすべてのListView要素が移動します。遷移が完了すると、「選択された」ListView要素が画面上に展開され、一部のコンテンツが表示されます。
質問:この移行はストックAPI関数で可能ですか?
Androidで次のアクティビティ遷移を実行しようとしています。
1では、通常のListViewが表示されます。ここで(2)、ListView要素に指を置き、指を左にスライドすると、指が置かれている要素を除いて、他のすべてのListView要素が移動します。遷移が完了すると、「選択された」ListView要素が画面上に展開され、一部のコンテンツが表示されます。
質問:この移行はストックAPI関数で可能ですか?
JellyBean以上をターゲットにしている場合は、ActivityOptionsクラスを使用してアクティビティ起動アニメーションをカスタマイズできます。
これを実現するための擬似コードは次のとおりです。
Intent i = //the intent for the new activity
View v = //the selected list item
Bundle bundle = ActivityOptions.makeScaleUpAnimation(v, 0, 0, v.getWidth(), v.getHeight()).toBundle();
startActivity(i, bundle);
@hasanghaforianは技術的には正しいですが、AdapterViewのサブクラス化は非常に困難です。このアプローチを採用することをお勧めします。完全に機能する例を含めました。
public class MainActivity extends Activity {
private RelativeLayout layout;
private ListView listView;
private MyRenderer selectedRenderer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
layout = new RelativeLayout(this);
setContentView(layout);
listView = new ListView(this);
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
layout.addView(listView, rlp);
listView.setAdapter(new MyAdapter());
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// find out where the clicked view sits in relationship to the
// parent container
int t = view.getTop() + listView.getTop();
int l = view.getLeft() + listView.getLeft();
// create a copy of the listview and add it to the parent
// container
// at the same location it was in the listview
selectedRenderer = new MyRenderer(view.getContext());
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(view.getWidth(), view
.getHeight());
rlp.topMargin = t;
rlp.leftMargin = l;
selectedRenderer.textView.setText(((MyRenderer) view).textView.getText());
layout.addView(selectedRenderer, rlp);
view.setVisibility(View.INVISIBLE);
// animate out the listView
Animation outAni = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, -1f, Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 0f);
outAni.setDuration(1000);
outAni.setFillAfter(true);
outAni.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
ScaleAnimation scaleAni = new ScaleAnimation(1f,
1f, 1f, 2f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
scaleAni.setDuration(400);
scaleAni.setFillAfter(true);
selectedRenderer.startAnimation(scaleAni);
}
});
listView.startAnimation(outAni);
}
});
}
public class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return 10;
}
@Override
public String getItem(int position) {
return "Hello World " + position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyRenderer renderer;
if (convertView != null)
renderer = (MyRenderer) convertView;
else
renderer = new MyRenderer(MainActivity.this);
renderer.textView.setText(getItem(position));
return renderer;
}
}
public class MyRenderer extends RelativeLayout {
public TextView textView;
public MyRenderer(Context context) {
super(context);
setPadding(20, 20, 20, 20);
setBackgroundColor(0xFFFF0000);
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
rlp.addRule(CENTER_IN_PARENT);
textView = new TextView(context);
addView(textView, rlp);
}
}
}
この規格の欠点は、ListView
優れた物理特性(およびそれを変更する機能)がないことです。したがって、変更する場合は、独自のビューを実装する必要があります。AdapterViewがセミリストになるように、そのサブクラスViewGroup
を拡張する必要があります。AdapterView
詳細:
メソッド内のAdapterViewのアダプタを設定しますsetAdapter(Adapter adapter)
。
onLayout
メソッドをオーバーライドしてアイテムAdapterView
をリストに追加します。アイテムを測定して、リスト(実際にはAdapterView)の正しい位置にあるチャイルドビューとして追加する必要があります。
サンプル:
独自の3Dリスト(およびその記事のパート2)を作成すると、私が表示する内容の良いデモンストレーションが得られます。その目的は、3Dリストを作成することです。詳細、スニペットコード、および完全なコードを確認できます。ただし、変更する必要があります。onTouchEvent()
あなたが望むものに到達するために。
注:これはAPI1でも実行できます。
これがお役に立てば幸いです。
xmlファイルのListViewの下で、別の線形レイアウト/相対レイアウトを取得し、必要に応じて設計しますが、その可視性をなくす必要があることを確認してください。リストビューアイテムをタップしたら、コンテンツを入力し、これをすべて長押しします。アニメーションの場合は、左に拡大縮小します。
そのリスト要素を押すと、このアニメーションを呼び出す必要があります。アニメーションを実行する必要があります。そのアニメーションでは、それを設計する必要があります。これらのアニメーションでは、画像を使用する場合は、9つのパッチ画像を使用します。