Как добиться мультитач для всей деятельности?

У меня есть одно действие с линейным макетом, и внутри этого макета есть несколько линейных макетов, и каждый линейный макет имеет установленные кнопки и текстовые представления. Я хочу добиться мультитач-функции для всего экрана, что означает, что если пользователь выполняет увеличение-уменьшение с помощью пальца, он должен увеличивать и уменьшать масштаб всего экрана (увеличение и уменьшение всех кнопок, размер текстовых представлений соответственно один раз).

Как добиться этого с помощью Android 2.1?

С уважением, Пикс


person piks    schedule 08.06.2012    source источник
comment
ты решил проблему. . . . мне нужно такое же решение. . .плз помогите мне   -  person Nirmal Prajapat    schedule 06.03.2018


Ответы (1)


Это может дать вам представление:

import java.util.ArrayList;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet;
//import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;

public class MultitouchView extends View {
    private static final int STROKE_WIDTH = 1;
    private static final int CIRCLE_RADIUS = 20;

    private ArrayList<PointF> touchPoints = null;
    private Paint drawingPaint = null;
    private boolean isMultiTouch = false;
    private int pathEffectPhase = 0;

    public MultitouchView(Context context) {
        super(context);

        initialize(context);
    }

    public MultitouchView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        initialize(context);
    }

    public MultitouchView(Context context, AttributeSet attrs) {
        super(context, attrs);

        initialize(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        if(touchPoints.size() > 0)
        {
            DashPathEffect effect = new DashPathEffect(new float[] {7,7}, pathEffectPhase);
            PointF midpt = null;

            drawingPaint.setPathEffect(effect);

            for(int index=1; index<touchPoints.size(); ++index)
            {
                midpt = getMidPoint(
                        touchPoints.get(index - 1).x,touchPoints.get(index - 1).y,
                        touchPoints.get(index).x,touchPoints.get(index).y);

                canvas.drawCircle(
                        touchPoints.get(index - 1).x,touchPoints.get(index - 1).y, 
                        1, drawingPaint);
                canvas.drawCircle(
                        touchPoints.get(index - 1).x,touchPoints.get(index - 1).y, 
                        CIRCLE_RADIUS, drawingPaint);

                canvas.drawCircle(touchPoints.get(index).x,touchPoints.get(index).y, 
                        1, drawingPaint);
                canvas.drawCircle(touchPoints.get(index).x,touchPoints.get(index).y, 
                        CIRCLE_RADIUS, drawingPaint);

                canvas.drawLine(
                        touchPoints.get(index - 1).x,touchPoints.get(index - 1).y,
                        touchPoints.get(index).x,touchPoints.get(index).y,
                        drawingPaint);

                canvas.drawCircle(midpt.x,midpt.y, 10, drawingPaint);
            }

            ++pathEffectPhase;

            invalidate();
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

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

        switch(action)
        {
            case MotionEvent.ACTION_DOWN:
            {
                invalidate();

                break;
            }
            case MotionEvent.ACTION_POINTER_DOWN:
            {
                isMultiTouch = true;

                setPoints(event);
                invalidate();

                break;
            }
            case MotionEvent.ACTION_POINTER_UP:
            {
                isMultiTouch = false;

                break;
            }
            case MotionEvent.ACTION_MOVE:
            {
                if(isMultiTouch)
                {
                    setPoints(event);
                    invalidate();
                }

                break;
            }
        }

        return true;
    }   

    private void initialize(Context context){
        drawingPaint = new Paint();

        drawingPaint.setColor(Color.RED);
        drawingPaint.setStrokeWidth(STROKE_WIDTH);
        drawingPaint.setStyle(Paint.Style.STROKE);
        drawingPaint.setAntiAlias(true);

        touchPoints = new ArrayList<PointF>();
    }

    public void setPoints(MotionEvent event){
        touchPoints.clear();

        int pointerIndex = 0;

        for(int index=0; index<event.getPointerCount(); ++index)
        {
            pointerIndex = event.getPointerId(index);

            touchPoints.add(new PointF(event.getX(pointerIndex),event.getY(pointerIndex)));
        }
    }

    private PointF getMidPoint(float x1,float y1, float x2, float y2) {
        PointF point = new PointF();

        float x = x1 + x2;
        float y = y1 + y2;

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

        return point;
    }
}
person reuf    schedule 08.06.2012
comment
Не могли бы вы рассказать, как приведенный выше код поможет мне реализовать мой сценарий, в котором размер всего экрана должен быть изменен после того, как пользователь выполняет сенсорные операции на экране. Если приведенный выше код применим для моего сценария, то как я могу включить его для родительского элемента моей деятельности? линейный макет, поэтому мультитач будет применим для всех компонентов внутри макета, если я хочу использовать этот класс в своей деятельности для поддержки мультитач, то как использовать его внутри моей активности? - person piks; 08.06.2012
comment
Какой уровень API вы используете? - person reuf; 08.06.2012
comment
Ознакомьтесь с этим сообщением в блоге и комментариями ниже: myandroidnote.blogspot.com/ 2011/03/zooming-view-completely.html - person reuf; 08.06.2012
comment
Спасибо, что помогли мне... ссылка, которой вы поделились со мной, имеет правильный сценарий, который я ищу, но, похоже, он будет работать с уровня API 11, и я использую уровень API 7 :(, поэтому, если у вас есть какие-либо другой способ добиться этого, пожалуйста, поделитесь со мной. - person piks; 08.06.2012
comment
не работает. я просто хочу увеличить свою активность на мультитач, как в программе чтения PDF. - person AnAndroid; 15.01.2014