我正在尝试在 Android 中完成以下 Activity 转换:
在1中,我们看到了一个常见的 ListView。现在(2),当我将手指放在 ListView 元素上并向左滑动手指时,所有其他 ListView 元素都会移开,但我的手指放在上面的元素除外。如果转换完成,“选定”ListView 元素会在屏幕上展开并显示一些内容。
问题:库存 API 函数是否可以进行这种转换?
我正在尝试在 Android 中完成以下 Activity 转换:
在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
是缺乏良好的物理学(以及改变它的能力)。因此,如果你想改变它,你只需要实现你自己的视图。你必须扩展它的一个子类ViewGroup
,AdapterView
这样AdapterView就会成为你的半List。
详情:
setAdapter(Adapter adapter)
在方法中为您的 AdapterView 设置适配器。
覆盖onLayout
将项目添加到您的方法的方法AdapterView
。您必须测量并将项目作为子视图添加到列表的正确位置(实际上是您的 AdapterView)。
样品:
制作自己的 3D 列表(以及那篇文章的第 2 部分)很好地演示了我为您显示的内容。其目的是创建 3D 列表。您可以查看更多详细信息、代码片段和完整代码。尽管您必须更改它onTouchEvent()
达到你想要的。
注意:您甚至可以在 API1 中执行此操作。
我希望这对你有帮助!
在您的 xml 文件中,在 ListView 下方,采用另一个线性布局/相对布局并根据您的需要进行设计,但要确保它的可见性必须消失。当您点击列表视图项目时,用您的内容填充它并长按完成所有操作。对于动画,将其缩放到左侧。
当您按下该列表元素时,它应该为此调用动画,您必须通过动画。在该动画中,您应该设计它,如果您使用图像,则在这些动画中意味着通过 9 个补丁图像