Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在TEXTVIEW上平滑地执行放大和缩小以及放大特定的缩放位置?_Java_Android_Textview_Zooming_Pinchzoom - Fatal编程技术网

Java 如何在TEXTVIEW上平滑地执行放大和缩小以及放大特定的缩放位置?

Java 如何在TEXTVIEW上平滑地执行放大和缩小以及放大特定的缩放位置?,java,android,textview,zooming,pinchzoom,Java,Android,Textview,Zooming,Pinchzoom,我将在包含文本的TextView上执行放大和缩小操作。我可以放大和缩小,但我需要使缩放功能更加平滑(比如在Chrome浏览器中缩放页面)。在执行放大和缩小操作(使用收缩缩放方法)时,我将以中心对齐的方式缩放文本内容,但我希望在放大的位置缩放内容。 我附上由我完成的代码,请为我建议一个解决方案 这是我的活动文件: public class ZoomTextView extends TextView { private static final String TAG = "ZoomTex

我将在包含文本的
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文件:



提前谢谢。

我想你应该用放大镜,这样就可以了

放大镜可以通过编程在任意视图上使用,如下所示:

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

此处视图可以替换为文本视图或任何特定视图

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

更具体地说

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

下面是使用示例



我曾经研究过一个视图的放大/缩小,该视图可以有多个子视图(包括任何类型的视图和文本视图)

我使用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来获取刻度(捏手势被捕获)

参考我的问题,所有细节都在这里


事实上,您的想法很好,但放大镜功能需要API级别28,这一级别现在已不太为客户所使用。此外,我的apk的目标水平是25,即棉花糖。您能帮我找到另一个可行的解决方案吗?然后您可以通过编程方式增加textView的textSize,此选项在每个API设备上都适用。另一种方法是使用WebView显示textView内容,因为WebView具有默认的放大缩小属性。您的解决方案看起来很有希望,让我试试你的想法,我会很快更新你。谢谢。如果你对缩放有任何疑问,一定要告诉我。
<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>
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
    }
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
        }
    }