放大/缩小整个页面布局
我正在尝试编写用于放大/缩小应用程序整个页面/屏幕的代码。 我得到了这个链接
Android – 使用spread / pinch放大/缩小RelativeLayout
但是初学者很难理解所有要遵循的程序。
如果有人可以帮助并提供关于这个主题的更清晰的解释,我和其他初学者肯定会很感激。
到目前为止,我已经设置了MainActivity
, AnswerActivity
和Fragments
。
首先,让我们开始简单。 缩放比较容易。 (此代码未在其他示例中使用):
TextView rootView; rootView.setScaleX(sx); rootView.setScaleY(sx);
sx
和sy
是比例[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(); } } }