如何在android中缩放文本视图?

如何在android中缩放文本视图?,android,view,zooming,android-imageview,textview,Android,View,Zooming,Android Imageview,Textview,有人能指导我在android中对多个视图执行放大和缩小操作吗?我需要在触摸图像、文本视图时执行放大和缩小操作。我的父布局应该是什么?以下是触摸imageview时缩放图像的代码。如何缩放文本视图?请帮帮我 // These matrices will be used to scale points of the image Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); // The 3 states (e

有人能指导我在android中对多个视图执行放大和缩小操作吗?我需要在触摸图像、文本视图时执行放大和缩小操作。我的父布局应该是什么?以下是触摸imageview时缩放图像的代码。如何缩放文本视图?请帮帮我

   // These matrices will be used to scale points of the image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();

// The 3 states (events) which the user is trying to perform   
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

// these PointF objects are used to record the point(s) the user is touching
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;

private void zoom(View v, MotionEvent event) 
{
    ImageView view = (ImageView) v;
    view.setScaleType(ImageView.ScaleType.MATRIX);
    float scale;

    //  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());

        mode = DRAG;
        break;

    case MotionEvent.ACTION_UP: // first finger lifted

    case MotionEvent.ACTION_POINTER_UP: // second finger lifted

        mode = NONE;   

        break;

    case MotionEvent.ACTION_POINTER_DOWN: // first and second finger down

        oldDist = spacing(event);

        if (oldDist > 5f)
        {
            savedMatrix.set(matrix);
            midPoint(mid, event);
            mode = ZOOM;

        }
        break;

    case MotionEvent.ACTION_MOVE:

        if (mode == DRAG) 
        { 
            matrix.set(savedMatrix);
            matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); // create the transformation in the matrix  of points
        } 
        else if (mode == ZOOM) 
        { 
            // pinch zooming
            float newDist = spacing(event);

            if (newDist > 5f) 
            {
                matrix.set(savedMatrix);
                scale = newDist / oldDist; // setting the scaling of the
                // matrix...if scale > 1 means
                // zoom in...if scale < 1 means
                // zoom out
                matrix.postScale(scale, scale, mid.x, mid.y);
            }
        }
        break;  
    }

    view.setImageMatrix(matrix); // display the transformation on screen

}

/*
 * --------------------------------------------------------------------------
 * Method: spacing Parameters: MotionEvent Returns: float Description:
 * 
 * checks the spacing between the two fingers on touch
 * ----------------------------------------------------
 */

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);
}

/*
 * --------------------------------------------------------------------------
 * Method: midPoint Parameters: PointF object, MotionEvent Returns: void
 * Description: calculates the midpoint between the two fingers
 * ------------------------------------------------------------
 */   

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);
}
//这些矩阵将用于缩放图像的点
矩阵=新矩阵();
矩阵savedMatrix=新矩阵();
//用户试图执行的3个状态(事件)
静态最终int NONE=0;
静态最终整数阻力=1;
静态最终整数缩放=2;
int模式=无;
//这些PointF对象用于记录用户触摸的点
PointF start=新的PointF();
PointF mid=新的PointF();
浮动oldDist=1f;
专用空心缩放(视图v、运动事件)
{
ImageView视图=(ImageView)v;
view.setScaleType(ImageView.ScaleType.MATRIX);
浮标;
//dumpEvent(事件);
//在这里处理触摸事件。。。
开关(event.getAction()&MotionEvent.ACTION\u掩码)
{
case MotionEvent.ACTION\u DOWN:
//只有第一个手指向下
savedMatrix.set(矩阵);
set(event.getX(),event.getY());
模式=拖动;
打破
case MotionEvent.ACTION_UP://举起第一个手指
case MotionEvent.ACTION\u POINTER\u UP://举起食指
模式=无;
打破
case MotionEvent.ACTION\u POINTER\u DOWN://第一个和第二个手指向下
oldDist=间距(事件);
如果(旧区>5f)
{
savedMatrix.set(矩阵);
中点(中点,事件);
模式=缩放;
}
打破
case MotionEvent.ACTION\u移动:
如果(模式==拖动)
{ 
矩阵集(savedMatrix);
postTranslate(event.getX()-start.x,event.getY()-start.y);//在点矩阵中创建转换
} 
else if(模式==缩放)
{ 
//收缩变焦
float newDist=间距(事件);
如果(新距离>5f)
{
矩阵集(savedMatrix);
scale=newDist/oldDist;//设置
//矩阵…如果比例>1表示
//放大…如果比例小于1表示
//缩小
矩阵。后标度(标度、标度、中x、中y);
}
}
打破
}
view.setImageMatrix(矩阵);//在屏幕上显示转换
}
/*
* --------------------------------------------------------------------------
*方法:间距参数:MotionEvent返回:浮点描述:
* 
*触摸时检查两个手指之间的间距
* ----------------------------------------------------
*/
专用浮动间距(MotionEvent事件)
{
float x=event.getX(0)-event.getX(1);
float y=event.getY(0)-event.getY(1);
返回FloatMath.sqrt(x*x+y*y);
}
/*
* --------------------------------------------------------------------------
*方法:中点参数:PointF对象,MotionEvent返回:void
*描述:计算两个手指之间的中点
* ------------------------------------------------------------
*/   
专用空心中点(点F点、MotionEvent事件)
{
float x=event.getX(0)+event.getX(1);
float y=event.getY(0)+event.getY(1);
点集(x/2,y/2);
}

以上内容可以,但您可以按以下方式进行操作:

在oncreate()中,必须建立textview,并按如下所示在其上设置ontouch事件

TextView tv = (TextView)findViewById(R.id.name);
tv.setText("text");
tv.setOnTouchListener(this);
以下是完整的代码,包括您的代码:

public class MyTextView extends Activity implements OnTouchListener{
     private static final String TAG = "Touch";
        @SuppressWarnings("unused")
        private static final float MIN_ZOOM = 1f,MAX_ZOOM = 1f;

        // These matrices will be used to scale points of the image
        Matrix matrix = new Matrix();
        Matrix savedMatrix = new Matrix();

        // The 3 states (events) which the user is trying to perform
        static final int NONE = 0;
        static final int DRAG = 1;
        static final int ZOOM = 2;
        int mode = NONE;

        // these PointF objects are used to record the point(s) the user is touching
        PointF start = new PointF();
        PointF mid = new PointF();
        float oldDist = 1f;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    TextView iv = new TextView(this);
    iv.setText("text");
    iv.setOnTouchListener(this);
    setContentView(iv);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
     ImageView view = (ImageView) v;
     view.setScaleType(ImageView.ScaleType.MATRIX);
     float scale;

     dumpEvent(event);
     // Handle touch events here...

     switch (event.getAction() & 255) 
     {
         case MotionEvent.ACTION_DOWN:   // first finger down only
                                             savedMatrix.set(matrix);
                                             start.set(event.getX(), event.getY());
                                             Log.d(TAG, "mode=DRAG"); // write to LogCat
                                             mode = DRAG;
                                             break;

         case MotionEvent.ACTION_UP: // first finger lifted

         case 6: // second finger lifted

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

         case 5: // first and 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) 
                                             { 
                                                 matrix.set(savedMatrix);
                                                 matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); // create the transformation in the matrix  of points
                                             } 
                                             else if (mode == ZOOM) 
                                             { 
                                                 // pinch zooming
                                                 float newDist = spacing(event);
                                                 Log.d(TAG, "newDist=" + newDist);
                                                 if (newDist > 5f) 
                                                 {
                                                     matrix.set(savedMatrix);
                                                     scale = newDist / oldDist; // setting the scaling of the
                                                                                 // matrix...if scale > 1 means
                                                                                 // zoom in...if scale < 1 means
                                                                                 // zoom out
                                                     matrix.postScale(scale, scale, mid.x, mid.y);
                                                 }
                                             }
                                             break;
     }

     view.setImageMatrix(matrix); // display the transformation on screen

     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);
}

/*
 * --------------------------------------------------------------------------
 * Method: midPoint Parameters: PointF object, MotionEvent Returns: void
 * Description: calculates the midpoint between the two fingers
 * ------------------------------------------------------------
 */

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("Touch Events ---------", sb.toString());
}
}
公共类MyTextView扩展了活动实现到TouchListener上{
私有静态最终字符串TAG=“Touch”;
@抑制警告(“未使用”)
专用静态最终浮动最小缩放=1f,最大缩放=1f;
//这些矩阵将用于缩放图像的点
矩阵=新矩阵();
矩阵savedMatrix=新矩阵();
//用户试图执行的3个状态(事件)
静态最终int NONE=0;
静态最终整数阻力=1;
静态最终整数缩放=2;
int模式=无;
//这些PointF对象用于记录用户触摸的点
PointF start=新的PointF();
PointF mid=新的PointF();
浮动oldDist=1f;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
TextView iv=新的TextView(本);
iv.setText(“文本”);
iv.setOnTouchListener(本);
setContentView(四);
}
@凌驾
公共布尔onTouch(视图v,运动事件){
//TODO自动生成的方法存根
ImageView视图=(ImageView)v;
view.setScaleType(ImageView.ScaleType.MATRIX);
浮标;
dumpEvent(事件);
//在这里处理触摸事件。。。
开关(event.getAction()&255)
{
case MotionEvent.ACTION_DOWN://仅首指向下
savedMatrix.set(矩阵);
set(event.getX(),event.getY());
Log.d(标记,“mode=DRAG”);//写入LogCat
模式=拖动;
打破
case MotionEvent.ACTION_UP://举起第一个手指
案例6://第二个手指抬起
模式=无;
Log.d(标记“mode=NONE”);
打破
案例5://第一个和第二个手指向下
oldDist=间距(事件);
Log.d(标记“oldDist=“+oldDist”);
如果(旧区>5f){
savedMatrix.set(矩阵);
first you should convert Textview to imageview.Next you should apply sample image view drag functionality.
    -----------------------------



            TextView tv = new TextView(this);
            FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
                    FrameLayout.LayoutParams.FILL_PARENT,
                    FrameLayout.LayoutParams.FILL_PARENT);

            tv.setLayoutParams(layoutParams);
            tv.setText("Text");
            tv.setTextColor(Color.BLACK);
            tv.setBackgroundColor(Color.TRANSPARENT);

            Bitmap testB;

            testB = Bitmap.createBitmap(80, 100, Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(testB);
            tv.layout(30, 40, 200, 100);
            tv.draw(c);

            ImageView iv = (ImageView) findViewById(R.id.imageView);
            iv.setLayoutParams(layoutParams);
            iv.setBackgroundColor(Color.GRAY);`enter code here`
            iv.setImageBitmap(testB);
            iv.setMaxHeight(80);
            iv.setMaxWidth(200);

            iv.setOnTouchListener(this);
package com.app;

import android.os.Bundle;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.widget.TextView;
import android.support.v7.app.AppCompatActivity;
import android.view.View;


public class MyActivity extends AppCompatActivity implements View.OnTouchListener{

    public static final int TEXT_MAX_SIZE = 140;
    public static final int TEXT_MIN_SIZE = 40;
    private static final int STEP = 4;

    private int mBaseDistZoomIn;
    private int mBaseDistZoomOut;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);

        .
        .
        .
        TextView viewById = (TextView) findViewById(R.id.some_text_view);
        viewById.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getPointerCount() == 2) {
            TextView viewById = (TextView) findViewById(R.id.some_text_view);
            int action = event.getAction();
            int pure = action & MotionEvent.ACTION_MASK;

            if (pure == MotionEvent.ACTION_POINTER_DOWN
                    && viewById.getTextSize() <= TEXT_MAX_SIZE
                    && viewById.getTextSize() >= TEXT_MIN_SIZE) {

                mBaseDistZoomIn = getDistanceFromEvent(event);
                mBaseDistZoomOut = getDistanceFromEvent(event);

            } else {
                int currentDistance = getDistanceFromEvent(event);
                if (currentDistance > mBaseDistZoomIn) {
                    float finalSize = viewById.getTextSize() + STEP;
                    if (finalSize > TEXT_MAX_SIZE) {
                        finalSize = TEXT_MAX_SIZE;
                    }
                    viewById.setTextSize(TypedValue.COMPLEX_UNIT_PX, finalSize);
                } else {
                    if (currentDistance < mBaseDistZoomOut) {
                        float finalSize = viewById.getTextSize() - STEP;
                        if (finalSize < TEXT_MIN_SIZE) {
                            finalSize = TEXT_MIN_SIZE;
                        }
                        viewById.setTextSize(TypedValue.COMPLEX_UNIT_PX, finalSize);
                    }
                }
            }
            return true;
        }
        return false;
    }


    // good function to get the distance between the multiple touch
    int getDistanceFromEvent(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));
    }
}