TEL:400-8793-956
当前位置:程序、服务器

在Android中以多点触控计算每个手指下的像素

提问者: 近期获赞: 浏览人数: 发布时间:2021-01-06 13:05:41

 问:您好,我需要计算多点触摸中每个手指所覆盖的像素。当手指一一向下滑动时,它应该加上像素数,而向上指的手指应该减去该手指的像素数。我不知道它到底有什么问题。请帮助我,我坚持下去。

 
 public class MainActivity extends AppCompatActivity {
private static final int INVALID_POINTER_ID = -1;
private float mLastTouchX;
private float mLastTouchY;
private int mActivePointerId = INVALID_POINTER_ID;
private float mPosX;
private float mPosY;
private ScaleGestureDetector mScaleDetector;
private float mScaleFactor = 1.f;
float TouchMajor=0.0f;
float TouchMinor=0.0f;
//float Size = 0.0f;
Boolean IsRightSideActive = false;
Boolean IsLeftSideActive = false;
float RightPixSize=0.0f;
float LeftPixSize=0.0f;
float RightPixChange = 0.0f;
float LeftPixChange = 0.0f;
float Pressure = 0.0f;
String Orientaation = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Image img = new Image(getApplicationContext());
    setContentView(R.layout.activity_main);
    final ImageView MyimageView = (ImageView)findViewById(R.id.imageView);
    final TextView LeftPixelView = (TextView)findViewById(R.id.LeftPixelView);
    final TextView RightPixelView = (TextView)findViewById(R.id.RightPixelView);
    final TextView PressureView = (TextView)findViewById(R.id.PressureView);
    final TextView OrientationView = (TextView)findViewById(R.id.OrientationView);
    final Display display = getWindowManager().getDefaultDisplay();
    final int ScreenWidth = display.getWidth();
    if (MyimageView != null) {
        MyimageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
        public boolean onTouch(View arg0, MotionEvent event) {
                // get pointer index from the event object
             //   int pointerIndex = event.getActionIndex();
                mScaleDetector.onTouchEvent(event);
                // get pointer ID
              //  int pointerId = event.getPointerId(pointerIndex);
                // get masked (not specific to a pointer) action
                int maskedAction = event.getActionMasked();
                switch (maskedAction) {
                    case MotionEvent.ACTION_DOWN: {
                        final float x = event.getX();
                        final float y = event.getY();
                        mLastTouchX = x;
                        mLastTouchY = y;
                        ///Toast toast = Toast.makeText(getApplicationContext(), "Action down", Toast.LENGTH_SHORT);
                         //toast.show();
                        int pointerIndex = event.getActionIndex();
                        mActivePointerId = event.getPointerId(0);
                        TouchMajor = event.getTouchMajor(pointerIndex);
                        TouchMinor = event.getTouchMinor(pointerIndex);
                        Pressure = event.getPressure(pointerIndex);
                        PressureView.setText("Pressure :"+Float.toString(Pressure));
                        //Orientaation =Double.toString( event.getOrientation(mActivePointerId));
                        //left Side of scren
                        if(event.getX(mActivePointerId) < ScreenWidth/2)
                        {
                            LeftPixChange =  (TouchMajor + TouchMinor) / 2;
                            LeftPixSize = LeftPixChange;
                            LeftPixelView.setText(Float.toString(LeftPixSize));
                            OrientationView.setText("Left Side Clicked");
                        }
                        else if(event.getX(mActivePointerId) > ScreenWidth/2)
                        {
                             RightPixChange =  (TouchMajor + TouchMinor) / 2;
                             RightPixSize = RightPixChange;
                            RightPixelView.setText(Float.toString(RightPixSize));
                            OrientationView.setText("Right Side Clicked");
                        }
                        break;
                    }
                    case MotionEvent.ACTION_POINTER_DOWN: {
                       final int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
                                >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
                        final int pointerId = event.getPointerId(pointerIndex);
                        if (pointerId == mActivePointerId) {
                            // This was our active pointer going up. Choose a new
                            // active pointer and adjust accordingly.
                            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                             mLastTouchX = event.getX(newPointerIndex);
                             mLastTouchY = event.getY(newPointerIndex);
                            mActivePointerId = event.getPointerId(newPointerIndex);
                        }
                        TouchMajor = event.getTouchMajor(pointerIndex);
                        TouchMinor = event.getTouchMinor(pointerIndex);
                        Pressure =Pressure +  event.getPressure(pointerIndex);
                        PressureView.setText("Cummulative pressure :"+Float.toString(Pressure));
                        //Orientaation = Orientaation+","+ event.getOrientation(mActivePointerId);
                       // OrientationView.setText(Orientaation);
                       //we take pointerindex here because pointerId remains same but index will be increased
                        if(event.getX(pointerIndex) < ScreenWidth/2)
                        {
                            LeftPixChange = (TouchMajor + TouchMinor) / 2;
                            LeftPixSize =LeftPixSize + LeftPixChange;
                            LeftPixelView.setText(Float.toString(LeftPixSize));
                            OrientationView.setText("Multi Left side clicked");
                            IsLeftSideActive = true;
                        }
                        else if(event.getX(pointerIndex) > ScreenWidth/2)
                        {
                            RightPixChange = (TouchMajor + TouchMinor) / 2;
                            RightPixSize =RightPixSize + RightPixChange;
                            RightPixelView.setText(Float.toString(RightPixSize));
                            OrientationView.setText("Multi Right side clicked");
                            IsRightSideActive = true;
                        }
                        else
                        {
                            OrientationView.setText("Both Sidse Clicked simultaneously");
                        }
                        break;
                    }
                    case MotionEvent.ACTION_MOVE: { // a pointer was moved
                        // TODO use data
                        final int pointerIndex = event.findPointerIndex(mActivePointerId);
                        final float x = event.getX(pointerIndex);
                        final float y = event.getY(pointerIndex);
                      if (!mScaleDetector.isInProgress()) {
                            final float dx = x - mLastTouchX;
                            final float dy = y - mLastTouchY;
                            mPosX += dx;
                            mPosY += dy;
                            MyimageView.invalidate();
                        }
                        mLastTouchX = x;
                        mLastTouchY = y;
                        break;
                    }
                    case MotionEvent.ACTION_UP:{
                        mActivePointerId = INVALID_POINTER_ID;
                        //Toast toast = Toast.makeText(getContext(), "Action UP", Toast.LENGTH_SHORT);
                        //toast.show();
                        RightPixelView.setText(Float.toString(0.0f));
                        LeftPixelView.setText(Float.toString(0.0f));
                        PressureView.setText("Pressure : 0.0");
                        OrientationView.setText("");
                        break;
                    }
                    case MotionEvent.ACTION_POINTER_UP:{
                        final int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
                                >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
                        final int pointerId = event.getPointerId(pointerIndex);
                        if (pointerId == mActivePointerId) {
                            // This was our active pointer going up. Choose a new
                            // active pointer and adjust accordingly.
                            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                             mLastTouchX = event.getX(newPointerIndex);
                             mLastTouchY = event.getY(newPointerIndex);
                            mActivePointerId = event.getPointerId(newPointerIndex);
                        }
                        if(event.getX(pointerIndex) > ScreenWidth/2)
                        {
                            RightPixSize = RightPixSize - RightPixChange;
                            RightPixelView.setText(Double.toString(RightPixSize));
                        }
                        else if(event.getX(pointerIndex) < ScreenWidth/2){
                            LeftPixSize = LeftPixSize - LeftPixChange;
                            LeftPixelView.setText(Double.toString(LeftPixSize));
                            IsRightSideActive = false;
                        }
                        Pressure = Pressure - event.getPressure(event.getActionIndex());
                        PressureView.setText("Pressure :"+ Double.toString(Pressure));
                        break;
                    }
                    case MotionEvent.ACTION_CANCEL: {
                        // TODO use data
                        mActivePointerId = INVALID_POINTER_ID;
                        MyimageView.invalidate();
                        break;
                    }
                }
                  MyimageView.invalidate();
                return true;
            }});
    }
 
 
 
答:方法motionEvent.getSize()应该可以为您提供所需的信息(但准确度可能会因设备的屏幕而异)。从这个区域可以得到像素数。
 
上一篇: 当我单击列表视图上的项目时,列表视图未使我返回到DetailActivity.class
下一篇: 如何编写将应用程序信息存储在文本文件中的Python程序?