我想要实现的是这些:
当单击 recyclerView 中的一个项目时,应该显示详细信息活动,从我的手指触摸屏幕的点开始。
当我触摸向上箭头按钮或后退按钮时,详细信息活动应以圆形显示结束,并在我的手指最初触摸屏幕的位置停止。
我的代码:
MyRecyclerViewHolder
private OnGridItemClickedListener itemClickedListener
public MyRecyclerViewHolder(View itemView, OnGridItemClickedListener itemClickedListener) {
super(itemView);
ButterKnife.bind(this, itemView);
this.itemClickedListener = itemClickedListener;
rippleView.setOnTouchListener(touchListener);
}
private View.OnTouchListener touchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
itemClickedListener.onItemClick(getAdapterPosition(), null, (int)event.getY(), (int)event.getX());
}
return true;
}
};
我的片段
// Removed irrelevant codes
MyAdapter adapter = new MyAdapter(itemsList, true);
recyclerView.setLayoutManager(new GridAutoFitLayoutManager(getActivity(), MyConvert.dpToPx(150, getActivity())));
recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true);
adapter.setOnGridItemClickedListener(new OnGridItemClickedListener() {
@Override
public void onItemClick(int position, String stringId, int y, int x) {
launchMyDetailsActivity(position, y, x);
}
});
private void launchMyDetailsActivity(int index, int y, int x) {
Intent intent = new Intent(getActivity(), MyDetailsActivity.class);
intent.putExtra(Keys.EXTRA_Y, y);
intent.putExtra(Keys.EXTRA_X, x);
startActivity(intent);
}
我的详细信息活动
// Removed irrelevant codes
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid_details);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setViewListeners();
startEnterTransition();
}
private void startEnterTransition () {
coordinatorLayout.post(new Runnable() {
@Override
public void run() {
int x = getIntent().getIntExtra(Keys.EXTRA_X, 0);
int y = getIntent().getIntExtra(Keys.EXTRA_Y, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && x != 0 && y != 0) {
// get the final radius for the clipping circle
int finalRadius = Math.max(coordinatorLayout.getWidth(), coordinatorLayout.getHeight()) / 2;
// create the animator for this view (the start radius is zero)
Animator anim = ViewAnimationUtils.createCircularReveal(coordinatorLayout, x, y, 0, finalRadius);
// make the view visible and start the animation
coordinatorLayout.setVisibility(View.VISIBLE);
anim.start();
}
}
});
}
private void startExitTransition () {
int x = getIntent().getIntExtra(Keys.EXTRA_X, 0);
int y = getIntent().getIntExtra(Keys.EXTRA_Y, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && x != 0 && y != 0) {
int initialRadius = coordinatorLayout.getWidth() / 2;
Animator anim = ViewAnimationUtils.createCircularReveal(coordinatorLayout, x, y, initialRadius, 0);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
coordinatorLayout.setVisibility(View.INVISIBLE);
supportFinishAfterTransition();
}
});
anim.start();
} else {
supportFinishAfterTransition();
}
}
@Override
public void onBackPressed() {
startExitTransition();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
startExitTransition();
return true;
}
return super.onOptionsItemSelected(item);
}
问题
显示动画从屏幕的左上角开始,靠近汉堡图标,即使我单击的项目靠近屏幕底部。退出动画也是如此,它停在屏幕的左上角
退出动画结束后,屏幕闪烁,并不总是发生,但确实发生了。
已实施的解决方案
我已经在 viewHolder:itemView.getX()
和itemView.getY()
,itemView.getRight()
和itemView.getTop()
. 这些似乎解决了上面的第一个问题,但动画的进入和退出点总是与 recyclerView 项目的点不同。
请问我该如何解决上面的数字和2个问题?