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

标签 java android textview zooming pinchzoom

我即将对包含文本的 TextView 执行放大和缩小操作。我可以放大和缩小,但我需要使缩放功能更加流畅(例如在 Chrome 浏览器中缩放页面)。在执行放大和缩小操作(使用捏合缩放方法)时,我正在以居中对齐的方式缩放文本内容,我想缩放我正在放大的内容。 我附上我完成的代码,请为我提供解决方案。

这是我的 Activity 文件:

 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>

提前致谢。

最佳答案

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

可以在任意 View 上以编程方式使用放大镜,如下所示:

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

这里的View可以换成TextView或者任何特定的view

关于java - 如何平滑地执行放大和缩小以及在 TEXTVIEW 上的特定缩放位置进行缩放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52179182/

相关文章:

java - TextView 位置 : how can it be a float value ? - Android

java - 如何在套接字 channel 中发送和接收序列化对象

android - 如何从 Gradle 控制 Android 模拟器

android - 为 Google Play 和 Amazon Store 开发安卓应用

Android 在 TextView 或 EditView 中选择一个词

android ClickableSpan 拦截点击事件

Java equals 和 hashCode 方法 - 技术限制

java - iOS 中的 RSA SHA256 签名和 Java 上的验证

java - 重定向对 Tomcat 6.0 中子目录的所有请求

android - 从 android 应用程序访问外部存储中某个已下载的 .sqlite 数据库