android - RecyclerView 与 ImageViews,触摸缩放

标签 android animation imageview android-recyclerview

我是 Android 新手,我遇到了这个问题。我有一个包含 ImageView 的 RecyclerView。我想要做的是,当我触摸某个项目时,它应该将图像放大到原始大小。 RecyclerView 目前覆盖了屏幕的五分之一。我的适配器如下:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements View.OnTouchListener {

    private ArrayList<Bitmap> pieces;
    private RecyclerViewOnTouchListener touchListener;

    public interface RecyclerViewOnTouchListener {
        void onTouch(View v, MotionEvent event);
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {
    ImageView imageViewPiece;

    public MyViewHolder(View itemView) {
        super(itemView);
        this.imageViewPiece = (ImageView) itemView.findViewById(R.id.pieceImage);
        }
    }

    public MyAdapter(ArrayList<Bitmap> pieces, RecyclerViewOnTouchListener touchListener) {
        this.pieces = pieces;
        this.touchListener = touchListener;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // Inflate layout for recycler view
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler_view, parent, false);

        MyViewHolder myViewHolder = new MyViewHolder(view);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {
        ImageView imageView = holder.imageViewPiece;
        imageView.setOnTouchListener(this);
        imageView.setTag(listPosition);
        imageView.setImageBitmap(pieces.get(listPosition));
    }

    @Override
    public int getItemCount() {
        return pieces.size();
    }


    @Override
    public boolean onTouch(View v, MotionEvent event) {
        ImageView imageView = (ImageView) v.findViewById(R.id.pieceImage);

        if (touchListener != null) {
            touchListener.onTouch(imageView, event);
        }
        return false;
    }

}

我的 fragment 类中的相关部分如下:

MyAdapter.RecyclerViewOnTouchListener onTouchListener = new MyAdapter.RecyclerViewOnTouchListener() {

    @Override
    public void onTouch(ImageView v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_DOWN:
                // Enlarge image to its original size and remove it from the list, also it should be able to move in the recycler view.
                break;
            case MotionEvent.ACTION_UP:
                // Put image back to its position at list
                break;
            default:
                break;
        }
    }
};

我想它的逻辑应该是这样的,但我被困住了。我希望我已经写了足够的有关该问题的信息。

我的 fragment 如下所示:/image/ENj3T.png

我想触摸右边的一 block ,当我这样做时,它应该放大到原来的大小,当我停止触摸时,它应该返回到与其他 block 大小相同的列表。我也希望能够移动它。

最佳答案

首先进行一些小修复:

从 onBindViewHolder() 中删除这一行:

 imageView.setOnTouchListener(this);

将其放在 MyViewHolder 中:

this.imageViewPiece.setOnTouchListener(this);

因为您只需要初始化监听器 1,而不是每次绑定(bind)调用。

更改您的 OnTouchListener:

@Override
 public boolean onTouch(View v, MotionEvent event) {
    if (touchListener != null) {
        touchListener.onTouch((ImageView) v, event);
    }
    return false;
}

因为您知道您在 onTouch 中收到的项目就是您注册的项目。

然后你可以做类似的事情,你可以做一些调整:

MyAdapter.RecyclerViewOnTouchListener onTouchListener = new MyAdapter.RecyclerViewOnTouchListener() {
    Bitmap bitmap;
    int originalPosition, width, height;
    ImageView imageView;
    RelativeLayout.LayoutParams params;
    @Override
    public void onTouch(ImageView v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                int x = (int)event.getRawX();
                int y = (int) event.getRawY();
                params.leftMargin =  x - width / 2;
                params.topMargin =  y - height / 2;
                imageView.setLayoutParams(params);
                break;
            case MotionEvent.ACTION_DOWN:
                originalPosition = (int)v.getTag();
                bitmap = recycleAdapter.pieces.remove(originalPosition);
                recycleAdapter.nottifyDataSetChanged();
                width = bitmap.getWidth(); //maybe you need the drawable to get the intrinsic original dimens
                height = bitmap.getHeight();
                imageView = new ImageView(v.getContext());
                params = new RelativeLayout.LayoutParams(width, height);
                imageView.setImageBitmap(bitmap);
                RelativeLayout container; //here you need to bind this view to your container of fragment, better if it RelativeLayout to do dragging
                container.addView(imageView, params);
                // what you need to do is inflate here
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                container.removeView(imageView);
                recycleAdapter.pieces.add(originalPosition, bitmap);
                recycleAdapter.nottifyDataSetChanged();
                break;
            default:
                break;
        }
    }


};

关于android - RecyclerView 与 ImageViews,触摸缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31584754/

相关文章:

android - 在 Android 设备上下载后扩展文件的安全性

java - 您需要在单元测试中使用 Theme.AppCompat 主题 -->

angularjs - ngAnimate 不在 ng-repeat 上添加动画类

Android - ListView中的Imageview如何减少滞后?

android - ImageView 使手机中的图像比源图像大

android - Recyclerview 触摸事件

android - Textview 根据屏幕宽度的百分比居中对齐

jquery - CSS3 可折叠面板

animation - 等待/加载透明的GIF/APNG动画

android - 如何在ImageView中显示位图后获取位图的大小