捏缩放IN或OUT图像视图动态添加到布局

时间:2014-07-18 12:47:45

标签: android imageview android-imageview pinchzoom

我正在开发一个应用程序,其中 ImageView是动态创建的,并在用户从设备库中选择图像后添加到布局中。

使用我编写的代码,我可以移动和旋转ImageView。但是,我还想为ImageView实现Pinch放大/缩小。

代码中存在的错误是在将ImageView添加到布局后,ImageView在最右边时缩小,以便我想要做什么,但这应该发生在紧要关头。

编辑:调试我的代码后,我发现我想通过增加宽度和高度来增加ImageView的大小。 当我改变以下行时:     final RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(                                     RelativeLayout.LayoutParams.WRAP_CONTENT,                                     RelativeLayout.LayoutParams.WRAP_CONTENT); 到:

final RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                                    240,
                                    200);

我得到了我想要的东西。我可以在捏class DragImageView内进行此操作。

以下是自定义Imageview的代码。

public class DragImageView extends ImageView {

    private float mLastTouchX;
    private float mLastTouchY;

    private float mDeltaX;
    private float mDeltaY;
    private Bitmap bmpImg;
    Context mContext;

    public DragImageView(Context context, Bitmap bmpImg) {
        super(context);
        this.bmpImg = bmpImg;
        this.mContext = context;
        init();

    }

    public DragImageView(final Context context, final AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        // TODO Auto-generated method stub

        Bitmap resized = Bitmap.createScaledBitmap(bmpImg, 180, 200, true);
        Bitmap conv_bm = getRoundedShape(resized); //function to get the imageview as     rounded shape
        setImageBitmap(conv_bm);

        setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(final View v, MotionEvent event) {
                PopupMenu popup = new PopupMenu(mContext, v);
                // Inflating the Popup using xml file
                popup.getMenuInflater().inflate(R.menu.popup_menu,
                        popup.getMenu());

                popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {

                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        // TODO Auto-generated method stub
                        int itemId = item.getItemId();
                        if (itemId == R.id.delete_DragImgView) {
                            ViewGroup parentView = (ViewGroup) v.getParent();
                            parentView.removeView(v);
                        } else if (itemId == R.id.rotate_DraagImgView) {
                            final RotateAnimation rotateAnim = new RotateAnimation(
                                    0.0f, 90, RotateAnimation.RELATIVE_TO_SELF,
                                    0.5f, RotateAnimation.RELATIVE_TO_SELF,
                                    0.5f);
                            rotateAnim.setDuration(0);
                            rotateAnim.setFillAfter(true);
                            v.startAnimation(rotateAnim);
                        }
                        return false;
                    }
                });

                final int action = event.getAction();

                mLastTouchX = event.getRawX();
                mLastTouchY = event.getRawY();

                switch (action) {
                case MotionEvent.ACTION_DOWN: {
                    RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) getLayoutParams();
                    mDeltaX = mLastTouchX - lParams.leftMargin;
                    mDeltaY = mLastTouchY - lParams.topMargin;
                    popup.show();
                    break;
                }
                case MotionEvent.ACTION_MOVE: {
                    mLastTouchX = event.getRawX();
                    mLastTouchY = event.getRawY();

                    final RelativeLayout.LayoutParams params = (LayoutParams) getLayoutParams();
                    params.leftMargin = (int) (mLastTouchX - mDeltaX);
                    params.topMargin = (int) (mLastTouchY - mDeltaY);
                    setLayoutParams(params);

                    break;
                }
                }
                invalidate();

                return true;
            }
        });
    }

从活动中添加如下图像视图。

final DragImageView dynamicImgView = new DragImageView(
                            getApplicationContext(), yourSelectedImage);



                    final RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.WRAP_CONTENT,
                            RelativeLayout.LayoutParams.WRAP_CONTENT);
                    dynamicImgView.setLayoutParams(params);
                    relativeLayout.addView(dynamicImgView);

我知道缩放是可能的,但是在尝试了很多代码和来自堆栈流的帮助之后,想到最后把它放在上面。 请帮我。提前谢谢。

1 个答案:

答案 0 :(得分:1)

解决了我的问题..我只是增加了身高和imageview的宽度。代码

} else if (itemId == R.id.zoom_in) {
                            if (height > 100) {
                                height = height - ZoomCounter;
                                width = width - ZoomCounter;
                                final RelativeLayout.LayoutParams params = (LayoutParams) getLayoutParams();
                                getLayoutParams().height = height;
                                getLayoutParams().width = width;
                                setLayoutParams(params);
                                invalidate();
                            }

                        } else if (itemId == R.id.zoom_out) {
                            if (height < 600) {
                                height = height + ZoomCounter;
                                width = width + ZoomCounter;
                                final RelativeLayout.LayoutParams params = (LayoutParams) getLayoutParams();
                                getLayoutParams().height = height;
                                getLayoutParams().width = width;
                                setLayoutParams(params);

                                invalidate();
                            }
                        }