如何将图像移动到 x、y 坐标与当前比例和填充的位置

How to move Image to position x, y coordinate with current scale and padding

我在我的项目中使用 Photoview 库。我需要在带缩放的 Imageview 中 setPadding

当我使用 左填充和上填充 时,它工作得很好。它还可以根据需要从左侧和顶部移动图像。

mPhotoView.setPadding(150, 150, 0, 0);

但是,当我应用 right paddingbottom padding 时,它会应用 padding 但不会自动从当前位置移动。

mPhotoView.setPadding(0, 0, 150, 150);     //Issue here.

你需要使用约束,把它放在一个ConstraintLayout中,然后将边缘设置为0,或者将约束设置为你希望它不移动的程度。

https://medium.com/@eugenebrusov/using-of-constraintlayout-to-set-your-imageview-in-16-9-ratio-9979d53ba976

您可以使用父布局(LinearLayoutFramLayout)应用填充并将 ImageView 放入其中,以便其根据您的要求工作。

您可以使用ScaleType 属性,这样可以顺利管理。

您需要在 mPhotoView

中设置填充后使用 requestLayout()

public void requestLayout ()

  • 当某些事情发生变化而使该视图的布局无效时调用此方法。这将安排视图树的布局传递。这不应在视图层次结构当前处于布局过程中时调用(isInLayout()。如果布局正在发生,则可能会在当前布局过程结束时接受请求(然后布局将再次 运行)或者在绘制当前帧并发生下一个布局之后。

示例代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerInParent="true"
        android:onClick="ClickMe3"
        android:text="Remove Padding " />

    <com.github.chrisbanes.photoview.PhotoView
        android:id="@+id/photo_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:onClick="ClickMe"
        android:text="left and top " />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:onClick="ClickMe2"
        android:text="right and bottom " />


</RelativeLayout>

Activity Code

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;


import com.github.chrisbanes.photoview.PhotoView;

public class MainActivity extends AppCompatActivity {

    PhotoView mPhotoView;
    boolean flag = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPhotoView = (PhotoView) findViewById(R.id.photo_view);
        mPhotoView.setImageResource(R.drawable.dishu);

    }

    public void ClickMe(View view) {

        mPhotoView.setPadding(150, 150, 0, 0);
        mPhotoView.requestLayout();

    }

    public void ClickMe2(View view) {

        mPhotoView.setPadding(0, 0, 150, 150);
        mPhotoView.requestLayout();
    }

    public void ClickMe3(View view) {

        mPhotoView.setPadding(0, 0, 0, 0);
        mPhotoView.requestLayout();

    }


}

请检查以上代码的输出结果https://www.youtube.com/watch?v=828XI6ydNdY

更新

根据您的以下评论

My ImageView with FItXY scaletype. When I apply your code , Not working. same result. It can't move automatic as left padding.

实际上你的 padding Right 和 Bottom 是有效的 设置填充后,您需要滚动 mPhotoView

喜欢下面的代码

public class MainActivity extends AppCompatActivity {

    PhotoView mPhotoView;
    RelativeLayout rootView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        rootView =  findViewById(R.id.rootView);
        mPhotoView = (PhotoView) findViewById(R.id.photo_view);

        mPhotoView.setImageResource(R.drawable.dishu);
    }

    public void Left_Top(View view) {
        mPhotoView.setPadding(150, 150, 0, 0);
        mPhotoView.requestLayout();
    }

    public void Right_Bottom(View view) {
        mPhotoView.setPadding(0, 0, 150, 150);
        mPhotoView.requestLayout();
        // after setting padding scroll your mPhotoView to bottom
        mPhotoView.scrollTo(150,150);
    }

    public void ClickMe3(View view) {
        mPhotoView.setPadding(0, 0, 0, 0);
        mPhotoView.requestLayout();
        mPhotoView.scrollTo(0,0);
    }


}