Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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 如何在滚动视图中缩放文本视图?_Java_Android_Textview_Scrollview_Zooming - Fatal编程技术网

Java 如何在滚动视图中缩放文本视图?

Java 如何在滚动视图中缩放文本视图?,java,android,textview,scrollview,zooming,Java,Android,Textview,Scrollview,Zooming,我在这里看到了很多代码,这些代码有助于缩放文本视图,但没有一个可以用于我的文本,因为它位于滚动视图中。我怎样才能解决这个问题 import android.app.Activity; import android.os.Bundle; import android.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.TextView; pu

我在这里看到了很多代码,这些代码有助于缩放
文本视图
,但没有一个可以用于我的文本,因为它位于
滚动视图
中。我怎样才能解决这个问题

import android.app.Activity;
import android.os.Bundle;
import android.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;


public class Introduce extends Activity implements OnTouchListener{

final static float STEP = 200;
TextView mtxtRatio1,mtxtRatio2,mtxtRatio3,mtxtRatio4;
float mRatio = 1.0f;
int mBaseDist;
float mBaseRatio;
float fontsize = 13;

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.introduce);

  mtxtRatio1 = (TextView)findViewById(R.id.intro1);  
  mtxtRatio1.setTextSize(mRatio+13);  
} 

public boolean onTouchEvent(MotionEvent event) {
  if (event.getPointerCount() == 2) {
    int action = event.getAction();
    int pureaction = action & MotionEvent.ACTION_MASK;
    if (pureaction == MotionEvent.ACTION_POINTER_DOWN) {
      mBaseDist = getDistance(event);
      mBaseRatio = mRatio;
    } else {
      float delta = (getDistance(event) - mBaseDist) / STEP;
      float multi = (float)Math.pow(2, delta);
      mRatio = Math.min(1024.0f, Math.max(0.1f, mBaseRatio * multi));
      mtxtRatio1.setTextSize(mRatio+13);
    }
  }
  return true; 
}

int getDistance(MotionEvent event) {
  int dx = (int)(event.getX(0) - event.getX(1));
  int dy = (int)(event.getY(0) - event.getY(1));
  return (int)(Math.sqrt(dx * dx + dy * dy));
 }

public boolean onTouch(View v, MotionEvent event) {
  // TODO Auto-generated method stub
  return false; 
}
}

使用Polidea的zoomview,它可以在滚动视图中工作,并具有收缩缩放和双击缩放,有一件事我想,我最终禁用了收缩缩放,只使用了双击

将您的文本视图和您正在使用的任何其他视图放入位于滚动视图上的ZoomView上的线性布局中,例如:

<ScrollView 
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

         <com.polidea.ZoomView 
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >

                <LinearLayout
                       android:id="@+id/myLinearLayout"
                       android:layout_width="wrap_content"
                       android:layout_height="wrap_content"
                       android:orientation="vertical" >        
                </LinearLayout>

        </com.polidea.ZoomView>

</ScrollView>

希望这能帮助其他人。这个答案来自和

当文本调整大小时,即使手指是静态的(屏幕上有两个手指),来自的答案也有问题。我所做的是添加一个检查,以便
textSize
不会立即进行任何更改

private float safe;

public class simpleOnScaleGestureListener extends SimpleOnScaleGestureListener {

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        // TODO Auto-generated method stub
        float size = tv.getTextSize();
        Log.d("TextSizeStart", String.valueOf(size));

        //float factor = detector.getScaleFactor();
        float factor = Math.max(0.5f, Math.min(detector.getScaleFactor(), 2f));
        Log.d("Factor", String.valueOf(factor));


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

        safe = Math.abs(product - size);

        if(product <= 100 && product >= 20 && safe < 3){
            //tv.setText("factor= " +factor + "\n" +  "product = \n" + size + " * " + factor + " \n= " + product +"\n" + getString(R.string.hello_world));
            tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, product);
        }

        size = tv.getTextSize();
        Log.d("TextSizeEnd", String.valueOf(size));
        return true;
    }
}
private-float-safe;
公共类simpleOnScaleGestureListener扩展了simpleOnScaleGestureListener{
@凌驾
公共布尔标度(scalegestruedetector检测器){
//TODO自动生成的方法存根
float size=tv.getTextSize();
Log.d(“TextSizeStart”,String.valueOf(size));
//浮点因子=检测器。getScaleFactor();
float factor=Math.max(0.5f,Math.min(detector.getScaleFactor(),2f));
Log.d(“Factor”,String.valueOf(Factor));
浮积=尺寸*系数;
Log.d(“TextSize”,String.valueOf(product));
安全=数学abs(产品尺寸);
如果(产品=20&&safe<3){
//tv.setText(“factor=“+factor+”\n“+”product=\n“+size+”*“+factor+”\n=“+product+”\n”+getString(R.string.hello_world));
tv.setTextSize(TypedValue.COMPLEX\u UNIT\u PX,产品);
}
size=tv.getTextSize();
Log.d(“TextSizeEnd”,String.valueOf(size));
返回true;
}
}

您可以使用
safe<3
切换到所需的更改值。

以下是使用/不使用滚动视图实现文本视图缩进的方法

MainActivity.java

public class MainActivity extends AppCompatActivity{

    final static float STEP = 200;
    float mRatio = 1.0f;
    int mBaseDist;
    float mBaseRatio;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

        textViewData = (TextView).findViewById(R.id.tvContributeData);
        textViewData.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            if (event.getPointerCount() == 2) {
                int action = event.getAction();
                int pureaction = action & MotionEvent.ACTION_MASK;
                if (pureaction == MotionEvent.ACTION_POINTER_DOWN) {
                    mBaseDist = getDistance(event);
                    mBaseRatio = mRatio;
                } else {
                    float delta = (getDistance(event) - mBaseDist) / STEP;
                    float multi = (float) Math.pow(2, delta);
                    mRatio = Math.min(1024.0f, Math.max(0.1f, mBaseRatio * multi));
                    textViewData.setTextSize(mRatio + 13);
                }
            }
            return true;
        });

        int getDistance(MotionEvent event) {
            int dx = (int) (event.getX(0) - event.getX(1));
            int dy = (int) (event.getY(0) - event.getY(1));
            return (int) (Math.sqrt(dx * dx + dy * dy));
        }
    }
}
我正在使用这个解决方案。 本文对缩放算法进行了改进

使用不带ScrollView的文本视图,只需使用android:scrollbars=“vertical”


这是一个独立的java文件,如何连接到我的textview,假设我的textview是“r11”?!更新了答案,以显示布局和视图如何驻留在ZoomView上该库不再受支持
public class MainActivity extends AppCompatActivity{

    final static float STEP = 200;
    float mRatio = 1.0f;
    int mBaseDist;
    float mBaseRatio;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

        textViewData = (TextView).findViewById(R.id.tvContributeData);
        textViewData.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            if (event.getPointerCount() == 2) {
                int action = event.getAction();
                int pureaction = action & MotionEvent.ACTION_MASK;
                if (pureaction == MotionEvent.ACTION_POINTER_DOWN) {
                    mBaseDist = getDistance(event);
                    mBaseRatio = mRatio;
                } else {
                    float delta = (getDistance(event) - mBaseDist) / STEP;
                    float multi = (float) Math.pow(2, delta);
                    mRatio = Math.min(1024.0f, Math.max(0.1f, mBaseRatio * multi));
                    textViewData.setTextSize(mRatio + 13);
                }
            }
            return true;
        });

        int getDistance(MotionEvent event) {
            int dx = (int) (event.getX(0) - event.getX(1));
            int dy = (int) (event.getY(0) - event.getY(1));
            return (int) (Math.sqrt(dx * dx + dy * dy));
        }
    }
}
        <TextView
        android:id="@+id/activity_content_text_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_weight="1"
        android:gravity="fill"
        android:textSize="8pt"
        android:scrollbars="vertical"
        />
public class MainActivity extends Activity implements View.OnTouchListener {

   private TextView textContent = null;
   private final static float move = 200;
   private float ratio = 1.0f;
   private int baseDist;
   private float baseRatio;

   @Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.teste_layout);
       textContent = findViewById(R.id.activity_content_text_content);
       textContent.setText("Lorem ipsum dolor sit amet......");

       textContent.setMovementMethod(new ScrollingMovementMethod());
       textContent.setOnTouchListener(this);
    }


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


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getPointerCount() == 2){

            int action = event.getAction();
            int mainAction = action&MotionEvent.ACTION_MASK;

            if(mainAction == MotionEvent .ACTION_POINTER_DOWN){
                    baseDist = getDisTance(event);
                    baseRatio = ratio;
                } else {
                    float scale = (getDisTance(event)-baseDist)/move;
                    float factor = (float)Math.pow(2, scale);
                ratio = Math.min(1024.0f, Math.max(0.1f, baseRatio*factor));
                textContent.setTextSize(ratio+15);
            }
        } else {
            return false;
        }
        return true;
    }

    private int getDisTance(MotionEvent event) {
        int dx = (int) (event.getX(0)-event.getX(1));
        int dy = (int) (event.getY(0)-event.getY(1));
        return (int) (Math.sqrt(dx*dx+dy*dy));
    }
}