【问题标题】:How to zoom a textview in android?如何在android中缩放文本视图?
【发布时间】:2012-05-01 15:57:32
【问题描述】:

谁能指导我在 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);
}

【问题讨论】:

    标签: android view zooming android-imageview textview


    【解决方案1】:

    我找到了一个非常简单的解决方案来实现文本视图的放大/缩小。也许它可以帮助某人

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

    【讨论】:

      【解决方案2】:
      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);
      

      【讨论】:

        【解决方案3】:

        要缩放文本视图,您可以使用与缩放图像相同的代码。但是您应该将 textview 更改为 imageview,然后执行缩放操作。这是将textview转换为imageview的链接Converting a TextView->Bitmap->ImageView, and nothing's showing up

        【讨论】:

        • 如果您想为边界变化设置动画,但又不想缩放文本怎么办?
        【解决方案4】:

        上面没问题,但你如下::

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

        【讨论】:

        • 谢谢阿加瓦尔。但它在触摸 TextView 时立即崩溃。错误:java.lang.ClassCastException:android.widget.TextView @ onTouch() 方法的第 1 行。你能告诉我我的父布局应该有什么并在图像、文本视图上执行缩放吗?
        • 我也得到了从 textview 到 imageview 的类转换异常。我们怎样才能解决它。
        • 是的,它崩溃了,因为它是为 imageview 而不是 textview
        猜你喜欢
        • 2015-04-16
        • 2012-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 2014-05-30
        • 1970-01-01
        • 2013-09-01
        相关资源
        最近更新 更多