如何在其所有子级的图像视图,按钮,文本视图中将捏缩放应用于相对布局

问题描述

enter image description here

如屏幕截图所示,我已将ImageView添加到相对布局,即主楼层地图。蓝色图标会动态添加。我想将缩放应用于整个相对布局,以便每当我们放大/缩小布局时图标将随主图像一起移动。目前,当我尝试按照以下代码缩放相对布局,然后放大/缩小仅应用于主图像而不应用于图像上添加的图标

public class ZoomrelativeLayout extends RelativeLayout 
{
    private static final int INVALID_POINTER_ID = -1;
    private Drawable mIcon;
    private float mPosX;
    private float mPosY;
    ZoomrelativeLayout temp;
    private float mLastTouchX;
    private float mLastTouchY;
    private int mActivePointerId = INVALID_POINTER_ID;

    private ScaleGestureDetector mScaleDetector;
    private float mScaleFactor = 1.f;

    public ZoomrelativeLayout(Context context) {
        this(context,null,0);
        temp = this;
    }

    public ZoomrelativeLayout(Context context,AttributeSet attrs) {
        this(context,attrs,AttributeSet attrs,int defStyle) {
        super(context,defStyle);
        mIcon = context.getResources().getDrawable(R.drawable.shheildlogo);
        mIcon.setBounds(0,mIcon.getIntrinsicWidth(),mIcon.getIntrinsicHeight());
        temp = this;
        mScaleDetector = new ScaleGestureDetector(context,new ScaleListener());
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // Let the ScaleGestureDetector inspect all events.

        mScaleDetector.onTouchEvent(ev);



        final int action = ev.getAction();
        switch (action & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN: {
                final float x = ev.getX();
                final float y = ev.getY();

                mLastTouchX = x;
                mLastTouchY = y;
                mActivePointerId = ev.getPointerId(0);
                break;
            }

            case MotionEvent.ACTION_MOVE: {
                final int pointerIndex = ev.findPointerIndex(mActivePointerId);
                final float x = ev.getX(pointerIndex);
                final float y = ev.getY(pointerIndex);

                // Only move if the ScaleGestureDetector isn't processing a gesture.
                if (!mScaleDetector.isInProgress()) {
                    final float dx = x - mLastTouchX;
                    final float dy = y - mLastTouchY;

                    mPosX += dx;
                    mPosY += dy;

                    invalidate();
                }

                mLastTouchX = x;
                mLastTouchY = y;

                break;
            }

            case MotionEvent.ACTION_UP: {
                mActivePointerId = INVALID_POINTER_ID;

                break;
            }

            case MotionEvent.ACTION_CANCEL: {
                mActivePointerId = INVALID_POINTER_ID;
                break;
            }

            case MotionEvent.ACTION_POINTER_UP: {
                final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
                        >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
                final int pointerId = ev.getPointerId(pointerIndex);
                if (pointerId == mActivePointerId) {
                    // This was our active pointer going up. Choose a new
                    // active pointer and adjust accordingly.
                    final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                    mLastTouchX = ev.getX(newPointerIndex);
                    mLastTouchY = ev.getY(newPointerIndex);
                    mActivePointerId = ev.getPointerId(newPointerIndex);
                }


                break;
            }
        }
        return true;
    }

    @Override
    protected void onLayout(boolean changed,int l,int t,int r,int b)
    {
        int count = getChildCount();
        Log.d("onLayout",""+count);
        for(int i=0;i<count;i++){
            View child = getChildAt(i);
            if(child.getVisibility()!=GONE ){
                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)child.getLayoutParams();
                child.layout(
                        (int)(params.leftMargin * mScaleFactor),(int)(params.topMargin * mScaleFactor),(int)((params.leftMargin + child.getMeasuredWidth()) * mScaleFactor),(int)((params.topMargin + child.getMeasuredHeight()) * mScaleFactor)
                );


                child.setLayoutParams(params);
            }
        }
    }




    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.save();
        canvas.translate(mPosX,mPosY);
        canvas.scale(mScaleFactor,mScaleFactor);
        Log.d("onDraw",""+mScaleFactor);
        int count = getChildCount();
        for(int i=0;i<count;i++){
            View child = getChildAt(i);
            if(child.getVisibility()!=GONE){
                child.draw(canvas);
                Log.d("onDraw",""+mScaleFactor);
            }
        }

        canvas.restore();
    }
    @Override
    protected void dispatchDraw(Canvas canvas) {
        canvas.save();

        canvas.translate(mPosX,mScaleFactor);

        super.dispatchDraw(canvas);
        canvas.restore();
    }

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            mScaleFactor *= detector.getScaleFactor();

            mScaleFactor = Math.max(1.0f,Math.min(mScaleFactor,5.0f));
            temp.invalidate();
            invalidate();
            return true;
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...