当前位置: 首页 > 面试题库 >

放大/缩小整个页面布局

司空俊雄
2023-03-14
问题内容

我正在尝试编写代码以放大/缩小应用程序的整个页面/屏幕。给我这个链接

Android-使用展开/捏放大/缩小RelativeLayout

但是对于初学者来说,要理解所有遵循的程序确实非常困难。

如果有人可以提供帮助并提供有关此主题的更清晰的说明,我和其他初学者肯定会感激。

到目前为止,我有集MainActivityAnswerActivityFragments


问题答案:

首先,让我们从简单开始。缩放相对容易。(此代码在其他示例中未使用):

    TextView rootView;
    rootView.setScaleX(sx);
    rootView.setScaleY(sx);

sx并且sy是比例尺[X / Y]

这就是扩展的基础。现在我们进入最困难的部分:捏缩放。这要求用户以触摸事件的形式进行输入。

如果无法将onTouchEvent用于根视图,请首先设置onTouchListener。(我不会显示这部分)

在开始之前,请声明一个称为scaleFactor的浮点数:

[ANY-ACCESS-MODIFIER] long scaleFactor = 1f;

首先,我们需要一个ScaleGestureListener。如果需要,可以是一个嵌套类:

class Scaler extends ScaleGestureDetector {
    public Scaler(Context context, OnScaleGestureListener listener) {
        super(context, listener);
    }

    @Override
    public float getScaleFactor() {//Leave this method empty.
        return super.getScaleFactor();
    }
}

其次,我们需要OnScaleGestureListener:

class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener{

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        scaleFactor *= detector.getScaleFactor();

        if(scaleFactor > 2) scaleFactor = 2;//Limit to your liking
        else if(scaleFactor < 0.3f) scaleFactor = 0.3f;//Limit to your liking
        scaleFactor = (scaleFactor * 100) / 100;//jitter-protection
        //scaleMatrix.setScale(scaleFactor, scaleFactor, detector.getFocusX(), detector.getFocusY());//This is for usage with a Matrix: Good for canvas and other areas where this is usable. This is from my own scaling code, so I keep the matrix around in this example in case it is needed
        tv.setScaleX(scaleFactor);
        tv.setScaleY(scaleFactor);
        tv.setPivotX(detector.getFocusX());
        tv.setPivotY(detector.getFocusY());
        return true;
    }

    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {return true;}

    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {}
}

现在,这是一分为二的地方。如果可能,请使用onTouchEvent(MotionEvent ev)。如果您不能使用此方法(在@Override上面添加时显示错误),则必须改用onTouchListener。将其设置在TextView(上tv.setOnTouchListener(this);。确保该类实现OnTouchListener)

现在,无论选择哪种方法,都要确保返回true

这段代码应在两种方法中均有效,并且不仅限于特定方法:

(ev是MotionEvent)

    int pointers = ev.getPointerCount();

    if(pointers == 2) {

        zoom = true;
        s.onTouchEvent(ev);//pass original motionevent(unscaled) to zoom

    }

现在,基本代码已经准备就绪。现在我们需要为创建实例s

全局声明:

private Scaler s;
private ScaleListener listener;

以及您在布局中的位置:

listener = new ScaleListener();
s = new Scaler(c, listener);//c is a context.

现在,假设所有组件都就位,您将拥有一个正常运行的放大/缩小系统。请注意,这不包括在缩放视图上滚动。您必须创建一个offsetX /
Y变量,并在有一个指针的情况下接受输入,并检查要移动的距离。

通过使用TextView和touch事件,可以将#setScrollX或#setScrollY以及偏移量与新的滚动位置一起使用。

创建您自己的自定义文本视图可能会更容易。为此,您可以创建一个新类并使其扩展TextView。然后,您可以根据需要在其中进行修改。这将允许您将缩放等添加到自定义TextView中。如果您在一个班级中拥有多个文本视图,或者您有多个活动具有可缩放和可滚动的文本视图,则这是首选的方法。

编辑:自定义textview

可悲的是,并不是很多集成工具都无法正常工作。android:scrollbars在textview上不适用于实例。因此,首先,TextView必须具有一个ScrolLView:

<ScrollView android:id="@+id/textScroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.package.ZoomableTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some hfndusijhgn hgnm hnixjkgbhn fvb uynfv bunfg vbuygn buy hgnyu gnui h  uh nuioiogfej uhud\nfhbnikjhgnuieskhg nmuimjhbnguijhgne \nfuyh ghfuisdghbuisjhgnuie dgjh\nifgb dsauingfbehja kbfiuej ksghbisdjkg nbhni\ngfdfjgdfh hdfh sdfhg sh "/>

</ScrollView>

和ZoomableTextView:

您首先需要此依赖项:

compile 'com.android.support:appcompat-v7:25.3.1'

这是为了获得AppCompat库,以便TextView可以使用新功能,同时保持对早期版本的支持。现在上课:

public class ZoomableTextView extends AppCompatTextView/*This is why the AppCompat dependency is needed*/ {
    private float textSize,
            textScale;
    private Scaler s;
    private ScaleListener listener;
    public ZoomableTextView(Context context) {
        super(context);
        init();
    }

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

    public ZoomableTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public void init(){
        listener = new ScaleListener();
        s = new Scaler(getContext(), listener);
        textSize = getTextSize();
    }

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

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        super.onTouchEvent(ev);
        if(ev.getPointerCount() == 2){
            s.onTouchEvent(ev);
        }
        return true;
    }

    class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener{

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            textScale *= detector.getScaleFactor();

            if(textScale > 2) textScale = 2;//Limit to your liking
            else if(textScale < 0.3f) textScale = 0.3f;//Limit to your liking
            textScale = (textScale * 100) / 100;//jitter-protection
            if(textScale < 0.3f) textScale = 0.3f;
            if(textScale > 2) textScale = 2;

            setTextSize(textSize * textScale);
            setPivotX(detector.getFocusX());
            setPivotY(detector.getFocusY());
            return true;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {return true;}

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {}
    }

    class Scaler extends ScaleGestureDetector {
        public Scaler(Context context, OnScaleGestureListener listener) {
            super(context, listener);
        }

        @Override
        public float getScaleFactor() {//Leave this method empty.
            return super.getScaleFactor();
        }
    }
}


 类似资料:
  • 问题内容: 如何在Selenium WebDriver中更改页面缩放级别?我试过了: 但这是行不通的。 问题答案: 请注意,Selenium假定缩放级别为100%!例如,当缩放级别不同时,IE将拒绝启动(引发异常),因为元素位置取决于此,并且如果更改缩放级别,它将在错误的位置单击错误的元素。 Java 您可以使用以下方法: 请谨慎使用,并在完成后将缩放比例重置为100%: C# (因为我意识到C#

  • 问题内容: 我想拍摄一张图像并更改图像的比例,虽然它是一个numpy数组。 例如,我有一个可口可乐瓶的图像: bottle-1 转换为一个numpy的形状数组,我想调整其大小以表示第二个图像的大小: bottle-2 形状为。 如何在保持原始图像的同时将图像尺寸更改为特定形状?其他答案建议每隔一行或第三行剥离,但是我想要做的基本上是像通过图像编辑器(但在python代码中)那样收缩图像。是否有任何

  • 问题内容: 我有一个面板,其中正在移动一些2D对象。我已经根据需要重写了paintComponent()。现在,我希望能够放大和缩小该区域。放大时,将出现滚动条,通过滚动条可以滚动查看整个字段。在放大和缩小时,二维对象的大小应相应增加或减小。哪个Swing组件或什至是组件组合将有助于实现这一目标? 问题答案: 最简单的方法是修改面板并引入一个双倍来指示您的缩放级别。这双会指示你的规模,其中1是正常

  • 我对图像进行了收缩缩放,但是当我第一次加载应用程序时,整个图像不可见,只有一部分。图像填充了屏幕的宽度,但其上下都有空白。此外,当缩放图像时,图像变得非常短。纵横比应保持不变。 我希望在应用程序加载时使整个图像可见,然后我希望能够用两根手指缩小图像,其中图像不会小于屏幕的大小,以便屏幕始终充满(图像是地图)。 为了放大,图像应该超出手机屏幕的宽度和高度。这样我就可以平移过去查看地图的细节。 任何帮

  • 当前位置 private void chart1\u鼠标单击(object sender,MouseEventArgs e){ 缩放X和Y @taW

  • 问题内容: 我如何将放大和缩小添加到以下脚本,我想将其绑定到鼠标滚轮。如果您正在Linux上测试此脚本,请不要忘记将MouseWheel事件更改为Button-4和Button-5。 问题答案: 据我所知,内置的Tkinter Canvas类缩放不会自动缩放图像。如果无法使用自定义窗口小部件,则可以缩放原始图像,并在调用缩放功能时将其替换在画布上。 下面的代码片段可以合并到您的原始类中。它执行以下