簡體   English   中英

放大/縮小整個頁面布局

[英]Zoom in/out the whole page layout

我正在嘗試編寫代碼以放大/縮小應用程序的整個頁面/屏幕。 給我這個鏈接

Android-使用展開/捏放大/縮小RelativeLayout

但是對於初學者來說,要理解所有遵循的程序確實非常困難。

如果有人可以提供幫助並提供有關此主題的更清晰的說明,我和其他初學者肯定會感激的。

到目前為止,我已經設置了MainActivityAnswerActivityFragments

首先,讓我們從簡單開始。 縮放相對容易。 (此代碼在其他示例中未使用):

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

sxsy是scale [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

可悲的是,並不是很多集成工具都無法正常工作。 textview上的android:scrollbars不適用於實例。 因此,首先,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();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM