我有一个回收站视图,显示产品列表,每个回收站视图行项目中都有一个购物车图标。 在点击购物车图标时,我希望产品图像复制重新缩放并移动到右上角,进入操作栏上的购物车图标。
我的方法:
在recyclerview的行项目xml 中创建了一个ImageView,并使其最初不可见。 点击来自recyclerview的购物车图标,使图像视图可见,并使用图像网址填充图像视图,并从开始和结束位置添加翻译动画。
当前结果:
图像在相应的单个项目行内移动并且一旦到达行项目的边界就消失。我的意思是图像不是来自行项目而没有到达顶部操作栏菜单项。
解决方案:
public static void setAllParentsClip(View v, boolean enabled) {
while (v.getParent() != null && v.getParent() instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) v.getParent();
viewGroup.setClipChildren(enabled);
viewGroup.setClipToPadding(enabled);
v = viewGroup;
}
}
还手动设置xml中的所有父项:
android:clipChildren="false"
android:clipToPadding="false"
图像在触及行项目边界后仍然消失。任何建议都将是一个很好的帮助
我的RecyclerView适配器代码:
public class TrendingItemsAdapter extends RecyclerView.Adapter<TrendingItemsAdapter.MyViewHolder> {
private List<ProductEventDetail> productEventDetailList;
private Context context;
public TrendingItemsAdapter (List<ProductEventDetail> productEventDetailList){
this.productEventDetailList=productEventDetailList;
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView productName;
private TextView progressDisplay;
private ImageView imageView, addToCart,animImg;
private ProgressBar progressBar;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public MyViewHolder(View view) {
super(view);
productName=(TextView)view.findViewById(R.id.trending_Product_Name);
imageView=(ImageView)view.findViewById(R.id.trending_product_img);
addToCart=(ImageView)view.findViewById(R.id.add_to_cart);
animImg=(ImageView)view.findViewById(R.id.animProductImg);
progressDisplay=(TextView)view.findViewById(R.id.event_progress_value);
progressBar=(ProgressBar)view.findViewById(R.id.event_progress);
progressBar.setProgressDrawable(context.getDrawable(R.drawable.progress_tint));
addToCart.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId()==addToCart.getId()){
Toast.makeText(context,productEventDetailList.get(getAdapterPosition()).getProductName(),Toast.LENGTH_SHORT).show();
setAllParentsClip(animImg,false);
// Animation code
Animations anim = new Animations();
int fromLoc[] = new int[2];
imageView.getLocationOnScreen(fromLoc);
animImg.setVisibility(View.VISIBLE);
Glide.with(context)
.load(productEventDetailList.get(getAdapterPosition()).getProductImageUrl())
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.fitCenter()
.into(animImg);
float startX = fromLoc[0];
float startY = fromLoc[1];
Animation a = anim.fromAtoB(startX,startY, 1028, 143, animL,2000);
animImg.setAnimation(a);
a.startNow();
}
}
Animation.AnimationListener animL = new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
//this is just a method call you can create to delete the animated view or hide it until you need it again.
animImg.setVisibility(View.GONE);
}
};
}
@Override
public TrendingItemsAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
context=parent.getContext();
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.trending_item_row_detail, parent, false);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callProductEventDetails();
}
});
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(TrendingItemsAdapter.MyViewHolder holder, int position) {
ProductEventDetail productEventDetail= productEventDetailList.get(position);
holder.productName.setText(productEventDetail.getProductName()+ " xxxx xxxxxxxxxxxxxxxx..");
holder.progressBar.setProgress(productEventDetail.getEventProgressStatus());
holder.progressDisplay.setText(String.valueOf(productEventDetail.getEventProgressStatus())+"% ");
Glide.with(context)
.load(productEventDetail.getProductImageUrl())
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.fitCenter()
.into(holder.imageView);
}
@Override
public int getItemCount() {
return productEventDetailList.size();
}
private void callProductEventDetails(){
Intent intent= new Intent(context, ProductEventDetailActivity.class);
intent.putExtra("eventStatus","inProgress");
context.startActivity(intent);
}
public static void setAllParentsClip(View v, boolean enabled) {
while (v.getParent() != null && v.getParent() instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) v.getParent();
viewGroup.setClipChildren(enabled);
viewGroup.setClipToPadding(enabled);
v = viewGroup;
}
}
}