文本视图的捏合缩放

8

我希望为文本视图实现捏合功能(缩放/放大)。

我已经参考了许多教程,但没有得到任何有用的结果...如果有人完成了它或知道如何完成,请帮助我...

我可以使用按钮作为缩放和放大的方式,或者使用两个手指来捏合吗?

任何帮助都将不胜感激。谢谢。

不起作用的代码:

  setContentView(R.layout.main);
  mainView =(LinearLayout)findViewById(R.id.linearLayout);

  Button buttonZoomOut = (Button)findViewById(R.id.buttonZoomOut);
  Button buttonNormal = (Button)findViewById(R.id.buttonNormal);
  Button buttonZoomIn = (Button)findViewById(R.id.buttonZoomIn);

  buttonZoomOut.setOnClickListener(new View.OnClickListener() {    
   public void onClick(View v) {
    zoom(0.5f,0.5f,new PointF(0,0));    
   }
  });
  buttonNormal.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
    zoom(1f,1f,new PointF(0,0));  
   }
  });
  buttonZoomIn.setOnClickListener(new View.OnClickListener() {

   public void onClick(View v) {
    zoom(2f,2f,new PointF(0,0));   
   }
  });
 }

 /** zooming is done from here */
 public void zoom(Float scaleX,Float scaleY,PointF pivot){
  mainView.setPivotX(pivot.x);
  mainView.setPivotY(pivot.y);  
  mainView.setScaleX(scaleX);
  mainView.setScaleY(scaleY);  
 } 

Android - Pinch zoom 或许可以帮助您。 - Praveenkumar
重复问题会被下投票。这个问题已经被问过很多次了。 - IneQuation
2个回答

3
如果你想实现手指捏合功能,可以查看谷歌开发者博客提供的示例代码。我之前尝试过它,它能够正常工作并且非常适合学习。

是的,我现在看到了...这是用于缩放文本视图还是图像视图的示例代码? - shyam
嗨,实际上我需要对TextView进行缩放/捏合操作...我们能否通过将ImageView替换为TextView来实现这一点? - shyam
谷歌代码不适用于TextView,该逻辑仅适用于ImageView。 - kendrelaxman

0
你可以尝试以下代码... 它将TextView转换为图像,然后您可以对其进行缩放。 public class temp extends Activity implements OnTouchListener {
private static final String TAG = "Touch";

private static final float MIN_ZOOM = 1.0f;

private static final float MAX_ZOOM = 5.0f;

// These matrices will be used to move and zoom image

Matrix matrix = new Matrix();

Matrix savedMatrix = new Matrix();

// We can be in one of these 3 states

static final int NONE = 0;

static final int DRAG = 1;

static final int ZOOM = 2;

int mode = NONE;

// Remember some things for zooming

PointF start = new PointF();

PointF mid = new PointF();

float oldDist = 1f;

// 公共静态字符串列表

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

TextView tv = new TextView(this);
    LinearLayout.LayoutParams layoutParamsForText = new LinearLayout.LayoutParams(
            width,height);
    tv.setLayoutParams(layoutParamsForText);

    Bitmap testB;

    testB = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(testB);
    tv.layout(0, 0, width, height);
    tv.draw(c);

    ImageView view = (ImageView) findViewById(R.id.test_X);
    view.setLayoutParams(layoutParamsForText);
    view.setBackgroundColor(Color.WHITE);
    view.setImageBitmap(testB);
    view.setMaxHeight(height);
    view.setMaxWidth(width);
    // ImageView view = (ImageView) findViewById(R.id.test_X);

    // view.setLayoutParams(new GridView.LayoutParams(85, 85));

    view.setScaleType(ImageView.ScaleType.FIT_CENTER);

    view.setOnTouchListener(this);
}

public boolean onTouch(View v, MotionEvent event) {

    ImageView view = (ImageView) v;

    view.setScaleType(ImageView.ScaleType.MATRIX);

    float scale;

    // Dump touch event to log

    dumpEvent(event);

    // Handle touch events here...

    switch (event.getAction() & MotionEvent.ACTION_MASK) {

    case MotionEvent.ACTION_DOWN: // first finger down only

        savedMatrix.set(matrix);

        start.set(event.getX(), event.getY());

        Log.d(TAG, "mode=DRAG");

        mode = DRAG;

        break;

    case MotionEvent.ACTION_UP: // first finger lifted

    case MotionEvent.ACTION_POINTER_UP: // second finger lifted

        mode = NONE;

        Log.d(TAG, "mode=NONE");

        break;

    case MotionEvent.ACTION_POINTER_DOWN: // second finger down

        oldDist = spacing(event);

        Log.d(TAG, "oldDist=" + oldDist);

        if (oldDist > 5f) {

            savedMatrix.set(matrix);

            midPoint(mid, event);

            mode = ZOOM;

            Log.d(TAG, "mode=ZOOM");

        }

        break;

    case MotionEvent.ACTION_MOVE:

        if (mode == DRAG) { // movement of first finger

            matrix.set(savedMatrix);

            if (view.getLeft() >= -392) {

                matrix.postTranslate(event.getX() - start.x, event.getY()
                        - start.y);

            }

        }

        else if (mode == ZOOM) { // pinch zooming

            float newDist = spacing(event);

            Log.d(TAG, "newDist=" + newDist);

            if (newDist > 5f) {

                matrix.set(savedMatrix);

                scale = newDist / oldDist; /*
                                             * thinking i need to play
                                             * around with this value to
                                             * limit it
                                             */

                matrix.postScale(scale, scale, mid.x, mid.y);

            }

        }

        break;

    }

    // Perform the transformation

    view.setImageMatrix(matrix);

    return true; // indicate event was handled

}

private float spacing(MotionEvent event) {

    float x = event.getX(0) - event.getX(1);

    float y = event.getY(0) - event.getY(1);

    return FloatMath.sqrt(x * x + y * y);

}

private void midPoint(PointF point, MotionEvent event) {

    float x = event.getX(0) + event.getX(1);

    float y = event.getY(0) + event.getY(1);

    point.set(x / 2, y / 2);

}

/** Show an event in the LogCat view, for debugging */

private void dumpEvent(MotionEvent event) {

    String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",

    "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };

    StringBuilder sb = new StringBuilder();

    int action = event.getAction();

    int actionCode = action & MotionEvent.ACTION_MASK;

    sb.append("event ACTION_").append(names[actionCode]);

    if (actionCode == MotionEvent.ACTION_POINTER_DOWN

    || actionCode == MotionEvent.ACTION_POINTER_UP) {

        sb.append("(pid ").append(

        action >> MotionEvent.ACTION_POINTER_ID_SHIFT);

        sb.append(")");

    }

    sb.append("[");

    for (int i = 0; i < event.getPointerCount(); i++) {

        sb.append("#").append(i);

        sb.append("(pid ").append(event.getPointerId(i));

        sb.append(")=").append((int) event.getX(i));

        sb.append(",").append((int) event.getY(i));

        if (i + 1 < event.getPointerCount())

            sb.append(";");

    }

    sb.append("]");

    Log.d(TAG, sb.toString());

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接