Как увеличить текстовое представление в Android?

Может ли кто-нибудь помочь мне выполнить операции увеличения и уменьшения масштаба для нескольких представлений в Android? Мне нужно выполнять операции увеличения и уменьшения изображения при касании изображения, текстовых представлений. Каким должен быть мой родительский макет? Вот код для увеличения изображения при касании изображения. Как увеличить текстовое представление? Пожалуйста помогите.

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

person sachi    schedule 20.04.2012    source источник


Ответы (3)


Чтобы увеличить текстовое представление, вы можете использовать тот же код, что и для увеличения изображения. Но вы должны изменить текстовое представление на изображение, а затем выполнить операции масштабирования. Вот ссылка для преобразования текстового представления в изображение Bitmap-›ImageView, и ничего не отображается

person Santhosh    schedule 20.04.2012
comment
Что, если вы хотите анимировать изменение границ, но не масштабировать текст? - person Andrew Wyld; 21.10.2014

Вышеупомянутое в порядке, но вы к нему, как показано ниже ::

В oncreate() вы должны установить текстовое представление и установить для него событие 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());
}
}
person Shankar Agarwal    schedule 20.04.2012
comment
Спасибо, Агарвал. Но он сразу же падает при прикосновении к TextView. ОШИБКА: java.lang.ClassCastException: android.widget.TextView @ строка 1 метода onTouch(). И не могли бы вы сказать мне, какой должен быть мой родительский макет, чтобы иметь и выполнять масштабирование как изображения, так и текстового представления? - person sachi; 20.04.2012
comment
Я также получаю исключение приведения класса для просмотра текста в изображение. как мы можем это решить. - person harikrishnan; 11.12.2014
comment
да, это сбой, потому что это для просмотра изображений, а не для просмотра текста - person RejoylinLokeshwaran; 27.02.2018

Я нашел очень простое решение для увеличения/уменьшения масштаба в текстовом представлении. Может кому поможет

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));
    }
}
person Adriel Iclodean    schedule 24.04.2017