放大/缩小整个页面布局

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

Android – 使用spread / pinch放大/缩小RelativeLayout

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

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

到目前为止,我已经设置了MainActivityAnswerActivityFragments

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

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

sxsy是比例[X / Y]

这是扩展的基础。 现在我们来看看困难的部分:捏缩放。 这需要用户以触摸事件的forms输入。

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

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


编辑:自定义textview

可悲的是,并没有很多集成工具能够工作。 android:scrollbars textview上的android:scrollbars不适用于实例。 所以首先TextView必须有一个ScrolLView:

    

和ZoomableTextView:

您首先需要此依赖项:

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

这是为了获得AppCompat库,因此TextView可以使用新function,同时保持对早期版本的支持。 现在为class级:

 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(); } } }