微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 放大/缩小整个页面布局

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

Android – zoom in/out RelativeLayout with spread/pinch

但是初学者很难理解所有要遵循的程序.

如果有人可以帮助并提供关于这个主题的更清楚的解释,我和其他初学者一定会很感激.

到目前为止,我已经设置了MainActivity,AnswerActivity和Fragments.

解决方法:

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

    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)

现在,无论您选择哪种方法,都要确保它真正回归!

代码应该在两种方法中都有效,并且不限于特定方法

(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和触摸事件,您可以使用#setScrollX或#setScrollY以及偏移来设置新的滚动位置.

创建自己的自定义文本视图可能会更容易.您可以通过创建一个新类并使其扩展TextView来完成此操作.然后你可以根据需要进行修改.这将允许您将缩放等添加自定义TextView中.如果您在单个类中有多个textview,或者您有多个具有可缩放和可滚动文本视图的活动,则这是一种首选方法.

编辑:自定义textview

可悲的是,并没有很多集成工具能够工作. android: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();
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐