Android 我怎样才能不离开屏幕?

Android 我怎样才能不离开屏幕?,android,xamarin,imageview,zooming,Android,Xamarin,Imageview,Zooming,我英语说得不好 如果您不理解这个问题,我们深表歉意 LinearLayout _Main_Contact_Layout; FrameLayout _Main_Frame; ImageView _Main_Background; private List<string> _DrawerList_Item; private ListView _DrawerList; float _X, _Y; float _XX, _YY; int offset = 0, duration = 10

我英语说得不好

如果您不理解这个问题,我们深表歉意

LinearLayout _Main_Contact_Layout;
FrameLayout _Main_Frame; 
ImageView _Main_Background;
private List<string> _DrawerList_Item;
private ListView _DrawerList;

float _X, _Y;
float _XX, _YY;
int offset = 0, duration = 100;
float scaleX = 1.0f, scaleY = 1.0f;
float maxZoomLimit = 2.6f, minZoomLimit = 1.0f;

public bool OnTouch(View v, MotionEvent e)
{
    switch (e.Action)
    {
        case MotionEventActions.Down:

            _X = e.GetX();
            _Y = e.GetY();

            float _Start_X = 760, _Start_Y = 160;
            float _End_X = 1150, _End_Y = 490;

            WindowManagerLayoutParams _Params = new WindowManagerLayoutParams();
            _Params.X = (int)e.RawX;
            _Params.Y = (int)e.RawY;

            LayoutInflater inflater = (LayoutInflater)this.GetSystemService(Context.LayoutInflaterService);
            View _Popup = inflater.Inflate(Resource.Layout.Custom_Popup, null);

            PopupWindow _Window = new PopupWindow(_Popup, WindowManagerLayoutParams.WrapContent, WindowManagerLayoutParams.WrapContent);
            _Window.SetBackgroundDrawable(new BitmapDrawable());
            _Window.OutsideTouchable = true;

            TextView _SetupX = (TextView)_Popup.FindViewById(Resource.Id.x_text);
            TextView _SetupY = (TextView)_Popup.FindViewById(Resource.Id.y_text);

            _SetupX.Text = "X 좌표 : " + _X.ToString("#.##");
            _SetupY.Text = "Y 좌표 : " + _Y.ToString("#.##");

            DrawerLayout _lstDrawer = (DrawerLayout)v.FindViewById(Resource.Id._DrawerLayout);


            if(_Start_X > _X | _Start_Y > _Y | _End_X < _X | _End_Y < _Y )
            {
                _Window.Focusable = true;
                _Window.ShowAsDropDown(_Popup, _Params.X, _Params.Y);
                _Window.ShowAtLocation(_Popup, GravityFlags.Left | GravityFlags.Top, 0, 0);
                _lstDrawer.CloseDrawer((int)GravityFlags.Left);
            }

            else if (_Start_X < _X & _Start_Y < _Y & _End_X > _X & _End_Y > _Y & !_lstDrawer.IsDrawerOpen((int)GravityFlags.Left))
            {
                _lstDrawer.OpenDrawer((int)GravityFlags.Left);
                _Window.ShowAsDropDown(_Popup, _Params.X, _Params.Y);
                _Window.ShowAtLocation(_Popup, GravityFlags.Left | GravityFlags.Top, 0, 0);
            }

            else if (_lstDrawer.IsDrawerOpen((int)GravityFlags.Left))
            {
                _lstDrawer.CloseDrawer((int)GravityFlags.Left);
            }

            break;


        case MotionEventActions.Move:

            _XX = e.GetX() - _X;
            _YY = e.GetY() - _Y;

            //_Main_Background.SetX(_Main_Background.GetX() + _XX);
            //_Main_Background.SetY(_Main_Background.GetY() + _YY);

            _X = e.GetX();
            _Y = e.GetY();


            if (scaleX > 1.0f && scaleY > 1.0f)
            {
                _MoveToX(_XX);
                _MoveToY(_YY);

                Console.WriteLine("_XX : " + _XX.ToString());
                Console.WriteLine("_YY : " + _YY.ToString());
            }

            break;
    }

    return true;
}

private void _MoveToX(float xX)
{
    float futureX = _Main_Background.GetX() + _XX;
    if (futureX > 0 | futureX < 500)
    {
        _Main_Background.SetX(futureX);
    }
}

private void _MoveToY(float yY)
{
    float futureY = _Main_Background.GetY() + _YY;
    if (futureY > 0 | futureY < 500)
    {
        _Main_Background.SetY(futureY);
    }
}



private void _Zoom_In(View v)
{
    if (scaleX < maxZoomLimit && scaleY < maxZoomLimit)
    {
        Animation animation = new ScaleAnimation(scaleX, (scaleX + 0.2f), scaleY, (scaleY + 0.2f), _X, _Y);
        scaleX += 0.2f;
        scaleY += 0.2f;
        animation.Interpolator = new DecelerateInterpolator();
        animation.Duration = duration;
        animation.StartOffset = offset;
        animation.FillAfter = true;
        v.StartAnimation(animation);
    }
}

private void _Zoom_Out(View v)
{
    if (scaleX > minZoomLimit && scaleY > minZoomLimit)
    {
        Animation animation = new ScaleAnimation(scaleX, (scaleX - 0.2f), scaleY, (scaleY - 0.2f), _X, _Y);
        scaleY -= 0.2f;
        scaleX -= 0.2f;
        animation.Interpolator = new DecelerateInterpolator();
        animation.Duration = duration;
        animation.StartOffset = offset;
        animation.FillAfter = true;
        v.StartAnimation(animation);
    }
}
LinearLayout\u Main\u Contact\u布局;
框架布局(主框架);
图像视图(主背景);;
私人清单(抽屉清单)项目;;
私有列表视图_抽屉列表;
浮动X,Y;
浮点数_XX,_YY;
整数偏移=0,持续时间=100;
浮点数scaleX=1.0f,scaleY=1.0f;
float maxZoomLimit=2.6f,minZoomLimit=1.0f;
公共bool OnTouch(视图v,运动事件e)
{
开关(电动)
{
案例MotionEventActions.Down:
_X=e.GetX();
_Y=e.GetY();
浮点数_Start_X=760,_Start_Y=160;
浮点数X=1150,Y=490;
WindowManagerLayoutParams _Params=新的WindowManagerLayoutParams();
_Params.X=(int)e.RawX;
_参数Y=(int)e.RawY;
LayoutInflater充气器=(LayoutInflater)this.GetSystemService(Context.LayoutInflaterService);
查看弹出窗口=充气机。充气(Resource.Layout.Custom弹出窗口,空);
PopupWindow=新的PopupWindow(_Popup,WindowManagerLayoutParams.WrapContent,WindowManagerLayoutParams.WrapContent);
_SetBackgroundDrawable(新的BitmapDrawable());
_Window.OutsideTouchable=真;
TextView _SetupX=(TextView)_Popup.findviewbyd(Resource.Id.x_text);
TextView _SetupY=(TextView)_Popup.findviewbyd(Resource.Id.y_text);
_SetupX.Text=“X좌표 : " + _X.ToString(“#.###”);
_SetupY.Text=“Y좌표 : “+_Y.ToString(“#.###”);
抽屉布局_lstrawer=(抽屉布局)v.FindViewById(Resource.Id._抽屉布局);
如果(_Start_X>_X | _Start_Y>_Y | _End_X<_X | _End_Y<_Y)
{
_Window.Focusable=true;
_Window.showas下拉列表(_Popup,_Params.X,_Params.Y);
_Window.ShowAtLocation(_弹出,GravityFlags.Left | GravityFlags.Top,0,0);
_L抽屉。闭合抽屉((内部)重力标签。左侧);
}
else if(_Start_X<_X&_Start_Y<_Y&_End_X>_X&_End_Y>_Y&!_lstrawer.IsDrawerOpen((int)GravityFlags.Left))
{
_lstDrawer.OpenDrawer((int)GravityFlags.Left);
_Window.showas下拉列表(_Popup,_Params.X,_Params.Y);
_Window.ShowAtLocation(_弹出,GravityFlags.Left | GravityFlags.Top,0,0);
}
else if(lstrawer.IsDrawerOpen((int)GravityFlags.Left))
{
_L抽屉。闭合抽屉((内部)重力标签。左侧);
}
打破
case MotionEventActions。移动:
_XX=e.GetX()-X;
_YY=e.GetY()-\u Y;
//_Main_Background.SetX(_Main_Background.GetX()+_XX);
//_Main_Background.SetY(_Main_Background.GetY()+_YY);
_X=e.GetX();
_Y=e.GetY();
如果(scaleX>1.0f&&scaleY>1.0f)
{
_MoveToX(_XX);
_移动玩具(_-YY);
Console.WriteLine(“\uxx:”+\uxx.ToString());
Console.WriteLine(“YY:”+YY.ToString());
}
打破
}
返回true;
}
私有无效_MoveToX(浮动xX)
{
float futureX=\u Main\u Background.GetX()+\u XX;
如果(futureX>0 | futureX<500)
{
_主要背景:SetX(未来);
}
}
私人空间移动玩具(浮动yY)
{
float futureY=\u Main\u Background.GetY()+\u YY;
如果(未来>0 |未来<500)
{
_主要研究背景:塞蒂(未来);
}
}
私有空间放大(视图五)
{
if(scaleXminZoomLimit&&scaleY>minZoomLimit)
{
动画=新的缩放动画(scaleX,(scaleX-0.2f),scaleY,(scaleY-0.2f),X,Y);
scaleY-=0.2f;
scaleX-=0.2f;
animation.Interpolator=新减速器Interpolator();
动画。持续时间=持续时间;
animation.StartOffset=偏移量;
animation.FillAfter=true;
v、 StartAnimation(动画);
}
}
我为此担心了大约一个星期

我怎样才能不离开屏幕

调整刻度?如何触摸刻度

  • 使用按钮进行放大和缩小 ->决议

  • 使用按钮放大运动图像 ->决议

  • 如果在放大后移动图像,请先将图像移动到一个陌生的位置。 ->决议

  • 布局超出范围 ->决议

  • 仅在布局范围内移动(未解析)


  • \u MoveTo
    方法中修改
    if
    条件。
    x
    y
    是视图左上角的坐标。计算
    imageview
    的宽度和高度,确保
    x
    y
    值小于0且不小于屏幕宽度mi的值nus图像视图宽度

    例如:

        private void _MoveToX(float xX)
        {
            float futureX = _Main_Background.GetX() + xX;
            if (futureX <=0 && futureX >=YourScreenWidth -(_Main_Background.Width * scaleX))
            {
                _Main_Background.SetX(futureX);
                Console.WriteLine("futureY : " + (_Main_Background.Height * scaleX).ToString());
                Console.WriteLine("futureX : " + futureX.ToString());
            }
        }
    
        private void _MoveToY(float yY)
        {
            float futureY = _Main_Background.GetY() + yY;
            if (futureY <= 0 && futureY >=YourScreenHeight- (_Main_Background.Height * scaleY))
            {
                _Main_Background.SetY(futureY);
                Console.WriteLine("futureY : " + (_Main_Background.Height * scaleY).ToString());
                Console.WriteLine("futureY : " + futureY.ToString());
            }
        }
    
    private void\u MoveToX(浮动xX)
    {
    float futureX=\u Main\u Background.GetX()+xX;
    如果(futureX=YourScreenWidth-(_Main_Background.Width*scaleX))
    {
    _主要背景:SetX(未来);
    Console.WriteLine(“futureY:+(_Main_Background.Height*scaleX).ToString());
    Console.WriteLine(“futureX:+futureX.ToString());
    }
    }
    私人空间移动玩具(浮动yY)
    {
    float futureY=_Main_Background.GetY()+yY;
    如果(未来=屏幕高度-(_Main_Background.Height*scaleY))