java - 如果我尝试在 textview 中捏合,缩放不起作用

标签 java android scrollview pinchzoom

我正在尝试为 TextView 实现双指缩放。如果我将内容的宽度和高度保持为环绕内容,则缩放和滚动工作正常,即当我在 TextView 之外进行捏合缩放时工作正常,但如果在 TextView 内完成则不起作用。

我想在 TextView 中完成它。即当宽度和高度设置为与父级匹配时。

这是我的代码:

Activity 代码:

public class sukharta extends Activity {

TextView scaleGesture;
RelativeLayout relative;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sukharta);
    scaleGesture = (TextView) findViewById(R.id.article);
    scaleGesture.setText(R.string.twentyfive);
    relative = (RelativeLayout) findViewById(R.id.sv) ;

    // ******Set gesture on your TextView******
    relative.setOnTouchListener(new simpleOnScaleGestureListener(this));

}


public class simpleOnScaleGestureListener implements View.OnTouchListener,
        ScaleGestureDetector.OnScaleGestureListener {

    private ScaleGestureDetector relative;

    public simpleOnScaleGestureListener(Context context) {
        relative = new ScaleGestureDetector(context, this);
    }

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        // TODO Auto-generated method stub

        relative = detector;

        float size = scaleGesture.getTextSize();
        Log.d("TextSizeStart", String.valueOf(size));

        float factor = detector.getScaleFactor();
        Log.d("Factor", String.valueOf(factor));


        float product = size * factor;
        Log.d("TextSize", String.valueOf(product));
        scaleGesture.setTextSize(TypedValue.COMPLEX_UNIT_PX, product);

        size = scaleGesture.getTextSize();
        Log.d("TextSizeEnd", String.valueOf(size));
        return true;
    }

    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        return true;
    }

    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {

    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        relative.onTouchEvent(event);
        return true;
    }
}
}

XML代码:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/sv">

            <TextView
                android:id="@+id/article"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
    </RelativeLayout>

</ScrollView>

最佳答案

您需要修改您的手势,现在您的 TextView 正在占用全部可用空间。所以你必须在 TextView 上设置手势。

public class sukharta extends Activity {

    TextView scaleGesture;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);
        scaleGesture = (TextView) findViewById(R.id.article);
        scaleGesture.setText("25");
        scaleGesture.setMovementMethod(new ScrollingMovementMethod());

        // ******Set gesture on your TextView******
        scaleGesture.setOnTouchListener(new simpleOnScaleGestureListener(this));

    }


    public class simpleOnScaleGestureListener implements View.OnTouchListener,
            ScaleGestureDetector.OnScaleGestureListener {

        private ScaleGestureDetector gestureScale;

        public simpleOnScaleGestureListener(Context context) {
            gestureScale = new ScaleGestureDetector(context, this);
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            // TODO Auto-generated method stub

            gestureScale = detector;

            float size = scaleGesture.getTextSize();
            Log.d("TextSizeStart", String.valueOf(size));

            float factor = detector.getScaleFactor();
            Log.d("Factor", String.valueOf(factor));


            float product = size * factor;
            Log.d("TextSize", String.valueOf(product));
            scaleGesture.setTextSize(TypedValue.COMPLEX_UNIT_PX, product);

            size = scaleGesture.getTextSize();
            Log.d("TextSizeEnd", String.valueOf(size));
            return true;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            return true;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {

        }

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            gestureScale.onTouchEvent(event);
            return true;
        }
    }

}

注意 - 小建议,从大写字符开始你的类名,尽量避免内部类并专注于单一责任类设计。

关于java - 如果我尝试在 textview 中捏合,缩放不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45380218/

相关文章:

android - 如何让 Logcat 在 Android Studio 中保持全屏

android - 文件提供程序异常: Failed to find configured root that contains

android - ScrollView/NestedScrollView 内的 RecyclerView 无法正确滚动

c# - ScrollView 在 Xamarin Forms 中的另一个 ScrollView 中

java - 在 opengl 和自己的库中传递 vector (和其他结构)

Java 双重数学

javascript - 更改按钮类型以提交

java - Lombok 不通过 Maven 生成代码

java - 如何将响应存储在 Volley 的变量中?

android - 如何在已经包含 ScrollView 的 Android 应用程序上添加更多按钮?