Android添加到购物车动画来自Recyclerview

时间:2016-11-28 09:18:33

标签: android android-animation

我有一个回收站视图,显示产品列表,每个回收站视图行项目中都有一个购物车图标。 在点击购物车图标时,我希望产品图像复制重新缩放并移动到右上角,进入操作栏上的购物车图标

我的方法:

在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;
        }
    }
    }

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找添加到购物车动画,  你可以在这里找到解决方案 fly to cart animation