Java 放大/缩小整个页面布局

Java 放大/缩小整个页面布局,java,android,Java,Android,我正在尝试编写代码来放大/缩小应用程序的整个页面/屏幕。我得到了这个链接 但是对于初学者来说,理解所有要遵循的程序是非常困难的 如果有人能在这个话题上提供帮助和更清晰的解释,我和其他初学者一定会非常感激 到目前为止,我已经设置了main活动,应答活动和片段,首先,让我们从简单开始。缩放相对容易。(以下示例中未使用此代码): sx和sy是比例[X/Y] 这就是缩放的基本原理。现在我们来看最难的部分:收缩缩放。这需要用户以触摸事件的形式进行输入 如果无法对根视图使用onTouchEvent,请首先

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

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

如果有人能在这个话题上提供帮助和更清晰的解释,我和其他初学者一定会非常感激


到目前为止,我已经设置了
main活动
应答活动
片段
,首先,让我们从简单开始。缩放相对容易。(以下示例中未使用此代码):

sx
sy
是比例[X/Y]

这就是缩放的基本原理。现在我们来看最难的部分:收缩缩放。这需要用户以触摸事件的形式进行输入

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

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

[ANY-ACCESS-MODIFIER] long scaleFactor = 1f;
首先,我们需要一个scalegesturelelistener。如果需要,可以是嵌套类:

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

    @Override
    public float getScaleFactor() {//Leave this method empty.
        return super.getScaleFactor();
    }
}
其次,我们需要OnScale Listener:

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) {}
}
现在,基本代码已经就位。现在我们需要为
s
创建实例:

全球宣布:

private Scaler s;
private ScaleListener listener;
以及在何处对布局进行充气:

listener = new ScaleListener();
s = new Scaler(c, listener);//c is a context. 
现在,假设所有组件都已就位,您就有了一个功能正常的放大/缩小系统。请注意,这不包括缩放视图上的滚动。您必须创建一个offsetX/Y变量,并在有一个指针时进行输入,并检查要移动的距离

使用文本视图和触摸事件,您可以使用#setScrollX或#setScrollY以及偏移量来设置新的滚动位置

不过,创建自己的自定义文本视图可能更容易。您可以通过创建一个新类并使其扩展TextView来实现这一点。然后你可以随意修改。这将允许您将缩放等添加到自定义文本视图中。不过,如果您在一个类中有多个文本视图,或者您有多个具有可缩放和可滚动文本视图的活动,那么这是一种首选方法


编辑:自定义文本视图

遗憾的是,并没有多少集成工具可以工作
android:textview上的滚动条对实例不起作用。因此,首先TextView必须有一个滚动视图:

<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>
这是为了获得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();
        }
    }
}
public类ZoomableTextView扩展了appcompatitextview/*这就是为什么需要AppCompat依赖项的原因*/{
私有浮动文本大小,
文本尺度;
专用定标器;
专用ScaleListener侦听器;
公共ZoomableTextView(上下文){
超级(上下文);
init();
}
公共ZoomableTextView(上下文、属性集属性){
超级(上下文,attrs);
init();
}
公共ZoomableTextView(上下文上下文、属性集属性、int defStyleAttr){
super(上下文、attrs、defStyleAttr);
init();
}
公共void init(){
侦听器=新的ScaleListener();
s=新的定标器(getContext(),侦听器);
textSize=getTextSize();
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
}
@凌驾
公共事件(MotionEvent ev){
超级火山口(ev);
if(ev.getPointerCount()==2){
s、 火山口(ev);
}
返回true;
}
类ScaleListener实现ScaleGestureDetector.OnScaleGestureListener{
@凌驾
公共布尔标度(scalegestruedetector检测器){
textScale*=检测器.getScaleFactor();
如果(textScale>2)textScale=2;//根据您的喜好限制
否则,如果(textScale<0.3f)textScale=0.3f;//根据您的喜好进行限制
textScale=(textScale*100)/100;//抖动保护
如果(textScale<0.3f)textScale=0.3f;
如果(textScale>2)textScale=2;
setTextSize(textSize*textScale);
setPivotX(detector.getFocusX());
setPivotY(detector.getFocusY());
返回true;
}
@凌驾
公共布尔onScaleBegin(ScaleGetStereDetector检测器){return true;}
@凌驾
标尺上的公共空白(标尺检测器){}
}
类Scaler扩展了ScaleGestureDetector{
公共定标器(上下文,OnScaleGestureListener侦听器){
超级(上下文,听者);
}
@凌驾
public float getScaleFactor(){//将此方法留空。
返回super.getScaleFactor();
}
}
}

谢谢你,马蒂亚斯。我们在处理什么?文本视图?画布?@LunarWatcher。谢谢你在这里。我有
片段
文本视图
和图片。(顺便说一句,你能给我的帖子投上一票吗?我猜人们投下一票主要是为了获得
声誉
分数,这有点奇怪)。你想缩放的片段的根视图是什么布局?(布局类型)。而且一个被否决的选民不会因为被否决而获得任何声誉。编辑:根据您提供的链接,我假设您使用RelativeLayout。如果您没有,请留下您使用的注释所有
片段都在RelativeLayout中。非常感谢。对我来说,这听起来仍然很复杂。希望你不介意我在这个话题上不断向你寻求更多帮助:)当然,我现在就投票支持你的答案。如果有什么不合意的地方,尽管问,我会回答你的问题。缩放通常是一个很难的话题,因为除了缩放之外,捏和平移的触摸事件也必须加起来。我在回答中给出的代码是我在SurfaceView中使用的,并使用画布。如果出于某种原因,这不起作用,我将帮助您完成创建自己的文本视图的过程,您可以在其中处理zoom insi
<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>
compile 'com.android.support:appcompat-v7:25.3.1'
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();
        }
    }
}