Android 사용자 정의 view 드래그 볼 이동 실현

Android 응용 인터페이스 에서 볼 수 있 는 것 은 모두 하나의 View 로 구성 되 어 있 으 며 거의 모든 시각 적 컨트롤 은 View 를 기반 으로 작 성 된 것 입 니 다.View 에서 touch,즉 제스처 에 대한 캡 처 와 전달 을 제공 합 니 다.우 리 는 View 에서 제스처 를 다시 써 서 우리 가 필요 로 하 는 특성 을 달성 할 수 있 습 니 다.예 를 들 어 우 리 는 지금 게임 을 하려 고 한다.내용 은 매우 간단 하 다.그림 에서 보 듯 이 검은색 작은 공이 손가락 에 따라 이동 하고 핸드폰 화면 에서 이동 하도록 하 는 것 이다.

View 에 있 는 Public boolean onTouchEvent(MotionEvent event)방법 을 다시 써 서 모든 제스처 동작 을 얻 은 다음 에 필요 한 제스처 를 선택 하여 조작 할 수 있 습 니 다.
그래서 다음 과 같은 코드 를 얻 을 수 있 습 니 다.

/**
 * Created by obo on 15/8/21.
 */
public class TouchView extends View{
 
  public static String TAG = TouchView.class.getCanonicalName();
  //       
  private PointF currrentPosition = new PointF(100,100);
  //        
  private PointF moveStartPosition = new PointF(0,0);
  //        
  private PointF moveEndPosition = new PointF(0,0);
 
  private Context context;
 
  public TouchView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
  }
 
  @Override
  public void onDraw(Canvas canvas)
  {
    super.onDraw(canvas);
    canvas.drawCircle(currrentPosition.x + (moveEndPosition.x - moveStartPosition.x),currrentPosition.y+(moveEndPosition.y - moveStartPosition.y),50,new Paint());
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event) {
 
    switch (event.getActionMasked())
    {
      case MotionEvent.ACTION_DOWN:
        moveStartPosition.x = event.getX();
        moveStartPosition.y = event.getY();
        break;
      case MotionEvent.ACTION_MOVE:
        moveEndPosition.x = event.getX();
        moveEndPosition.y = event.getY();
        //  
        this.postInvalidate();
        break;
 
      case MotionEvent.ACTION_UP:
        currrentPosition.x += (moveEndPosition.x - moveStartPosition.x);
        currrentPosition.y += (moveEndPosition.y - moveStartPosition.y);
        moveStartPosition.x = moveEndPosition.x;
        moveStartPosition.y = moveEndPosition.y;
        break;
      default:
    }
    return true;
  }
}
현재 onTouchEvent 방법 이 ture 로 돌아 가 는 것 을 볼 수 있 습 니 다.이 View 는 현재 제스처 동작 을 캡 처 하려 는 것 임 을 나타 냅 니 다.여 기 는 누 르 기,이동,들 기 등 관련 동작 을 포함 합 니 다.false 로 돌아 가면 첫 번 째 ACTION 만 받 습 니 다.DOWN 은 누 른 응답 으로 이후 이동 제스처 와 들 어 올 린 제스처 를 얻 을 수 없습니다.
방법 onTouchEvent 에서 세 가지 일 을 했 습 니 다.1.사용자 가 손가락 을 눌 렀 을 때 누 르 기 시작 한 좌 표를 초기 화하 고 화면 을 새로 고침 하지 않 아 도 됩 니 다.2.사용자 가 손가락 을 움 직 일 때 사용자 의 손가락 위 치 를 기록 하고 화면 을 다시 새로 고침 합 니 다.3.사용자 가 제스처,즉 손가락 을 들 어 올 릴 때 위치 할당 값 을 기본 좌표 점 에 주 고 제스처 기점 좌표 와 제스처 종점 좌표 x,y 가 같다(0).
그리고 Matrix 를 사용 하면 전체 과정 을 더욱 간단 하 게 만 들 수 있 습 니 다.작은 공의 bitmap 만 미리 얻 으 면 matrix 를 사용 하여 작은 공 을 변위,변형,회전 을 포함 한 변환 을 할 수 있 습 니 다.여 기 는 matrix 의 변위 변환 효과 만 사용 하고 구체 적 인 실현 코드 는 다음 과 같 습 니 다.

/**
 * Created by obo on 15/8/26.
 */
public class MatrixView extends View {
 
  public final static String TAG = MatrixView.class.getCanonicalName();
  //bitmap    
  Matrix matrix = new Matrix();
  //   
  PointF startPoint = new PointF();
  //   bitmap
  Bitmap bitmap = Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888);
 
  public MatrixView(Context context, AttributeSet attrs) {
    super(context, attrs);
 
    Canvas canvas = new Canvas(bitmap);
    //   bitmap        
    canvas.drawCircle(50,50,50,new Paint());
  }
 
  @Override
  public void onDraw(Canvas canvas)
  {
    super.onDraw(canvas);
 
    canvas.drawBitmap(bitmap, matrix, new Paint());
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event)
  {
    super.onTouchEvent(event);
 
    if (event.getActionMasked() == MotionEvent.ACTION_MOVE)
    {
      matrix.postTranslate(event.getX() - startPoint.x, event.getY() - startPoint.y );
      //  
      this.postInvalidate();
    }
 
    startPoint.x = event.getX();
    startPoint.y = event.getY();
 
    return true;
 
  }
}
이 코드 가 실 현 된 효 과 는 이전 과 마찬가지 로 Matrix 변 수 를 추 가 했 고 Pointf 변 수 를 하나 줄 였 으 며 onTouchEvent 와 onDraw 방법 에서 의 코드 양도 약간 줄 었 다.Matrix 는 사실 3X3 의 행렬 로 Matrix 를 사용 하면 한 걸음 한 걸음 변 화 를 축적 할 수 있 습 니 다.matrix 를 몇 번 조작 하 든 그림 에 대한 처리 복잡 도 는 고정 적 이 고 변 하지 않 으 며 그림 을 신속하게 변환 할 수 있 습 니 다.이것 이 바로 matrix 를 사용 하 는 것 이 가 져 온 장점 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기