Android изменяет размер параметров макета просмотра с помощью щипка

Я делаю приложение, которое добавляет наклейки на фотографии, и я хочу изменить размер наклейки жестом щепотки.

 final ImageView newSticker = new ImageView(getApplicationContext());
                    newSticker.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT));
                    Bitmap sticker = BitmapFactory.decodeResource(getResources(),galleryList[position]);
                    newSticker.setImageBitmap(sticker);
                    viewGroup.addView(newSticker);

У меня есть макет кадра с ImageView, и я добавляю на него виды. Это метод onTouch для наклейки:

newSticker.setOnTouchListener(new View.OnTouchListener()
                    {
                        PointF DownPT = new PointF(); // Record Mouse Position When Pressed Down
                        PointF StartPT = new PointF(); // Record Start Position of 'img'
                        float olddistance;

                        @Override
                        public boolean onTouch(View v, MotionEvent event)
                        {
                            selectedSticker = newSticker;

                            switch (event.getAction())
                            {

                                case MotionEvent.ACTION_MOVE :
                                    if(event.getPointerCount() == 1)
                                    {
                                        newSticker.setX((int) (StartPT.x + event.getX() - DownPT.x));
                                        newSticker.setY((int) (StartPT.y + event.getY() - DownPT.y));
                                    }
                                    else if(event.getPointerCount() == 2)
                                    {
                                        final float dX =event.getX(0) - event.getX(1);
                                        final float dY =event.getY(0) - event.getY(1);
                                        float newdistance = (float) Math.sqrt(dX * dX + dY * dY);
                                        float distance = newdistance / olddistance;
                                        FrameLayout.LayoutParams lp= new FrameLayout.LayoutParams((int) (newSticker.getHeight() * distance), (int) (newSticker.getWidth() * distance));
                                        newSticker.setLayoutParams(lp);
                                    }
                                    StartPT.set( newSticker.getX(), newSticker.getY() );
                                    break;
                                case MotionEvent.ACTION_DOWN :
                                    if(event.getPointerCount() == 1)
                                    {
                                        DownPT.set(event.getX(), event.getY());
                                        StartPT.set(newSticker.getX(), newSticker.getY());
                                    }
                                    else if(event.getPointerCount() == 2)
                                    {
                                        final float odX =event.getX(0) - event.getX(1);
                                        final float odY =event.getY(0) - event.getY(1);
                                        olddistance = (float) Math.sqrt(odX * odX + odY * odY);
                                    }
                                    break;

                                case MotionEvent.ACTION_POINTER_DOWN:

                                case MotionEvent.ACTION_UP :
                                    // Nothing have to do
                                    break;
                                default :
                                    break;
                            }
                            return true;
                        }
                    });

В приведенном выше коде он успешно перемещает наклейки, но я не знаю, как изменить размер представления с помощью щепотки. Я не хочу, чтобы наклейка масштабировалась внутри этого представления, но я хочу, чтобы весь вид был изменен. Итак, я хочу изменить параметры макета с помощью щепотки.


person Aleksakb24    schedule 29.11.2020    source источник


Ответы (1)


Я решил это так, плюс у него есть вращение

 @Override
                public void onClick(View v)
                {

                    final ImageView newSticker = new ImageView(getApplicationContext());
                    newSticker.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT));
                    Bitmap sticker = BitmapFactory.decodeResource(getResources(),stickerArray.getResourceId(position,0));
                    newSticker.setImageBitmap(sticker);
                    viewGroup.addView(newSticker);

                    if(selectedSticker != null)
                        selectedSticker.setBackgroundColor(getResources().getColor(android.R.color.transparent));
                    selectedSticker = newSticker;
                    newSticker.setBackgroundResource(R.drawable.sticker_border);


                    newSticker.setOnTouchListener(new View.OnTouchListener()
                    {

                        float mX, mY;
                        float olddistance;
                        float height, width;
                        static final int INVALID_POINTER_ID = -1;
                        PointF mFPoint = new PointF();
                        PointF mSPoint = new PointF();
                        int mPtrID1, mPtrID2;
                        float mAngle;
                        float oldRotation;

                        @Override
                        public boolean onTouch(View v, MotionEvent event)
                        {
                            if(selectedSticker != null)
                                selectedSticker.setBackgroundColor(getResources().getColor(android.R.color.transparent));
                            selectedSticker = newSticker;
                            newSticker.setBackgroundResource(R.drawable.sticker_border);


                            switch (event.getActionMasked())
                            {

                                case MotionEvent.ACTION_MOVE :

                                    if (mPtrID1 != INVALID_POINTER_ID && mPtrID2 != INVALID_POINTER_ID)
                                    {
                                        PointF nfPoint = new PointF();
                                        PointF nsPoint = new PointF();

                                        getRawPoint(event, mPtrID1, nsPoint,newSticker);
                                        getRawPoint(event, mPtrID2, nfPoint,newSticker);

                                        mAngle = angleBetweenLines(mFPoint, mSPoint, nfPoint, nsPoint);

                                        mAngle = (mAngle+oldRotation)%360;

                                        newSticker.setRotation(mAngle);
                                    }


                                    if(event.getPointerCount() == 1)
                                    {

                                        newSticker.animate()
                                                .x(event.getRawX() + mX)
                                                .y(event.getRawY() + mY)
                                                .setDuration(0)
                                                .start();

                                    }
                                    else if(event.getPointerCount() == 2)
                                    {

                                        final float dX =event.getX(0) - event.getX(1);
                                        final float dY =event.getY(0) - event.getY(1);
                                        float newdistance = (float) Math.sqrt(dX * dX + dY * dY);
                                        float distance = newdistance - olddistance;
                                        float newWidth = ((width+distance > 150) ? (width + distance) : 150 );
                                        float newHeight = ((height+distance > 150) ? (height + distance) : 150 );
                                        FrameLayout.LayoutParams lp= new FrameLayout.LayoutParams((int) (newWidth), (int) (newHeight));
                                        newSticker.setLayoutParams(lp);

                                    }

                                    break;

                                case MotionEvent.ACTION_DOWN :
                                    mX = newSticker.getX() - event.getRawX();
                                    mY = newSticker.getY() - event.getRawY();

                                    mPtrID1 = event.getPointerId(event.getActionIndex());

                                    break;

                                case MotionEvent.ACTION_POINTER_DOWN:
                                    height = newSticker.getHeight();
                                    width = newSticker.getWidth();
                                    final float odX =event.getX(0) - event.getX(1);
                                    final float odY =event.getY(0) - event.getY(1);
                                    olddistance = (float) Math.sqrt(odX * odX + odY * odY);

                                    mPtrID2 = event.getPointerId(event.getActionIndex());
                                    getRawPoint(event, mPtrID1, mSPoint,newSticker);
                                    getRawPoint(event, mPtrID2, mFPoint,newSticker);

                                    oldRotation = newSticker.getRotation();

                                    break;

                                case MotionEvent.ACTION_UP:
                                    mPtrID1 = INVALID_POINTER_ID;
                                    break;

                                case MotionEvent.ACTION_POINTER_UP :
                                    height = newSticker.getHeight();
                                    width = newSticker.getWidth();

                                    mPtrID2 = INVALID_POINTER_ID;
                                    break;

                                case MotionEvent.ACTION_CANCEL:
                                    mPtrID1 = INVALID_POINTER_ID;
                                    mPtrID2 = INVALID_POINTER_ID;
                                    break;

                                default :
                                    break;
                            }
                            return true;
                        }
person Aleksakb24    schedule 05.12.2020