【问题标题】:How to perform Zoom IN and OUT Smoothly and Zooming in specific Zoom location on a TEXTVIEW?如何平滑地执行放大和缩小并在 TEXTVIEW 上放大特定的缩放位置?
【发布时间】:2019-02-10 05:57:16
【问题描述】:

我即将对包含文本的TextView 执行放大和缩小操作。我能够放大和缩小,但我需要使缩放功能更加平滑(比如在 Chrome 浏览器中缩放页面)。在执行放大和缩小操作(使用捏缩放方法)时,我正在以中心对齐的方式缩放文本内容,我想放大我正在放大的内容。 我附上我做的代码,请为我提出一个解决方案。

这是我的活动文件:

 public class ZoomTextView extends TextView {
     private static final String TAG = "ZoomTextView";
     private ScaleGestureDetector mScaleDetector;

     private float mScaleFactor = 1.f;
     private float defaultSize;

     private float zoomLimit = 3.0f;


     public ZoomTextView(Context context) {
         super(context);
         initialize();
     }

     public ZoomTextView(Context context, AttributeSet attrs) {
         super(context, attrs);
         initialize();
     }

     public ZoomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         initialize();
     }

     private void initialize() {
         defaultSize = getTextSize();
         mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener());

     }

     /***
      * @param zoomLimit
      * Default value is 3, 3 means text can zoom 3 times the default size
      */

     public void setZoomLimit(float zoomLimit) {
         this.zoomLimit = zoomLimit;
     }

     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
     }

     @Override
     public boolean onTouchEvent(@NonNull MotionEvent ev) {
         super.onTouchEvent(ev);
         mScaleDetector.onTouchEvent(ev);
         return true;
     }

     /*Scale Gesture listener class,
     mScaleFactor is getting the scaling value
     and mScaleFactor is mapped between 1.0 and and zoomLimit
     that is 3.0 by default. You can also change it. 3.0 means text
     can zoom to 3 times the default value.*/

     private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
         @Override
         public boolean onScale(ScaleGestureDetector detector) {
             mScaleFactor *= detector.getScaleFactor();
             mScaleFactor = Math.max(1.0f, Math.min(mScaleFactor, zoomLimit));
             setTextSize(TypedValue.COMPLEX_UNIT_PX, defaultSize * mScaleFactor);
             Log.e(TAG, String.valueOf(mScaleFactor));
             return true;
         }
     } }

这是我的 .xml 文件:

 <noman.zoomtextview.ZoomTextView
     android:layout_width="match_parent"
     android:layout_height="match_parent"

     android:layout_alignParentTop="true"
     android:layout_alignParentLeft="true"
     android:text="@string/sample_string"/> </RelativeLayout>

提前致谢。

【问题讨论】:

  • 如果您对缩放有任何疑问,请告诉。

标签: java android textview zooming pinchzoom


【解决方案1】:

我觉得你应该这样用放大镜

放大镜可以编程方式用于任意视图,如下所示:

View view = findViewById(R.id.view);
Magnifier magnifier = new Magnifier(view);
magnifier.show(view.getWidth() / 2, view.getHeight() / 2);

此处的视图可以替换为 TextView 或任何特定视图

【讨论】:

  • 其实你的idea不错,但是放大镜功能需要API level 28,现在客户用的比较少。此外,我的 apk 目标级别是 25,即 MarshMallow。你能帮我找到另一个可行的解决方案吗
  • 然后您可以通过编程方式增加 textView 的 textSize,此选项适用于所有 API 设备。
  • 另外一种方式是使用 WebView 来显示 TextView 内容,因为 webView 具有 Default zoom in zoom out 属性。
【解决方案2】:

如果您不介意添加另一个库,请尝试手势视图布局

更具体地说,https://static.javadoc.io/com.alexvasilkov/gesture-views/2.5.2/com/alexvasilkov/gestures/views/GestureFrameLayout.html

基本上,您将文本视图包装在 XML 中的 GestureFrameLayout 中。 它会根据您手指的位置和手势自动检测缩放、捏合和平移。开箱即用不需要额外的编码(除非你想实现非默认功能,如旋转、裁剪等)

用法示例在这里https://github.com/alexvasilkov/GestureViews/wiki/Usage

<com.alexvasilkov.gestures.views.GestureFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- GestureFrameLayout can contain only one child -->

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Layout content goes here -->

</FrameLayout>

【讨论】:

  • 您的解决方案看起来很有希望,让我试试您的想法,我会尽快更新您。谢谢。
【解决方案3】:

我为一个可以有多个子视图的放大/缩小工作(包括任何类型的视图和文本视图)。

My Project

我使用 ScaleX 和 ScaleY api 来缩放父视图。

private fun applyScaleAndTranslationToChild() {
        child().scaleX = scaleFactor
        child().scaleY = scaleFactor
        child().pivotX = 0f  // default is to pivot at view center
        child().pivotY = 0f  // default is to pivot at view center
        child().translationX = translateX
        child().translationY = translateY
    }

上述方法用于应用放大和缩小,并且缩放的焦点也是固定的。

我使用 ScaleGestureListener 来获取比例(捏手势被这个捕获)

inner class ScaleListner : ScaleGestureDetector.SimpleOnScaleGestureListener() {

        override fun onScale(scaleDetector: ScaleGestureDetector?): Boolean {
            val scaleFactor = scaleDetector!!.scaleFactor
            setScaleAndTranslation(scaleFactor, scaleDetector.focusX, scaleDetector.focusY)
            return true
        }

        override fun onScaleEnd(detector: ScaleGestureDetector?) {
            super.onScaleEnd(detector)
            setLayoutParamOfChild()
        }

        private fun setScaleAndTranslation(scaleFactor: Float, focusX: Float, focusY: Float) {
            if (lastScaleFactor == 0f || Math.signum(scaleFactor) == Math.signum(lastScaleFactor)) {
                val prevScale = this@ZoomView.scaleFactor
                this@ZoomView.scaleFactor *= scaleFactor
                this@ZoomView.scaleFactor = Math.max(MIN_ZOOM, Math.min(this@ZoomView.scaleFactor, MAX_ZOOM))
                lastScaleFactor = scaleFactor
                val adjustedScaleFactor = this@ZoomView.scaleFactor / prevScale
                // added logic to adjust translateX and translateY for pinch/zoom pivot point
                translateX += (translateX - focusX) * (adjustedScaleFactor - 1)
                translateY += (translateY - focusY) * (adjustedScaleFactor - 1)
            } else {
                lastScaleFactor = 0f
            }
            isSingleTapConfirmed = false
        }
    }

请参阅我的问题,所有详细信息都在这里。

Android: Zooming EditText Android Issue in translation And Getting Touch event of childView when Placed outside parentView

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多