Matrix 에서 preTranslate()와 post Translate()의 이 해 를 상세히 말 합 니 다.

머리말
   곽 림 대신 블 로 그 를 볼 때 Matrix 가 Camera 와 결합 해 그림 을 실현 하 는 3D 회전 이 있 었 는데,그 중에서 Matrix 의 preTranslate()와 post Translate()방법 은 당시 에 잘 몰 랐 기 때문이다.안 드 로 이 드 에서 그림 처리 내용 을 별로 보지 못 했 기 때문에 도리 에 맞지 않 을 것 입 니 다.그러나 그림 의 3D 회전 을 볼 줄 아 는 이상 이것 은 반드시 넘 어야 할 관문 이기 때문에 자 료 를 조금 보 았 는데 내 가 잘못 이해 한 것 일 뿐 그렇게 어렵 지 않다 는 것 을 알 게 되 었 다.본 고 는 내 가 그 당시 에 어떻게 이 해 했 는 지 말 하 는 것 이다.
이루어지다
『8195』효과 도 를 먼저 살 펴 보 자.

  원 도와 세 장의 처 리 된 그림 을 볼 수 있 습 니 다.왼쪽 과 오른쪽 그림 의 윗부분 과 밑부분 은 대칭 적 이지 않 고 중간 에 있 는 그림 만 대칭 적 입 니 다.제 가 원 하 는 결과 그림 은 바로 중간 에 있 는 그림 입 니 다.왜 세 장의 다른 회전 그림 이 나 옵 니까?회전 중심 이 다 르 기 때문이다.
우 리 는 먼저 소스 코드 를 살 펴 보 자.

public class MainActivity extends AppCompatActivity {

 private ImageView view2,view3,view4;

 @Override
 protected void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  view2 = (ImageView) findViewById(R.id.iv2);
  view3 = (ImageView) findViewById(R.id.iv3);
  view4 = (ImageView) findViewById(R.id.iv4);
  Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.i004);
  /**
   *      (0,0)
   */
  Matrix matrix = getMatrix();
  Bitmap bit = getBitmap(bitmap, matrix);
  view2.setImageBitmap(bit);

  /**
   *      (0,height/2)
   */
  matrix = getMatrix();
  matrix.preTranslate(0, -bitmap.getHeight() / 2);
  matrix.postTranslate(0, bitmap.getHeight() / 2);
  bit = getBitmap(bitmap, matrix);
  view3.setImageBitmap(bit);

  /**
   *      (0,height)
   */
  matrix = getMatrix();
  matrix.preTranslate(0, -bitmap.getHeight());
  matrix.postTranslate(0,bitmap.getHeight());
  bit = getBitmap(bitmap, matrix);
  view4.setImageBitmap(bit);

 }

 private Bitmap getBitmap(Bitmap bitmap, Matrix matrix) {
  return Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
 }

 @NonNull
 private Matrix getMatrix(){
  Matrix matrix = new Matrix();
  Camera camera = new Camera();
  camera.save();
  camera.rotateY(45);
  camera.getMatrix(matrix);
  camera.restore();
  return matrix;
 }
}

왼쪽 그림:
  원본 코드 에서 우 리 는 왼쪽 그림 을 보 았 습 니 다.우 리 는 Matrix 에 대해 아무런 처리 도 하지 않 았 기 때문에 Camera 의 rotateY()방법 은 y 축 으로 회전 할 때 회전 중심 은(0,0)입 니 다.다음 그림 과 같 습 니 다.

  회전 중심 은 그림 의 대칭 점 에 있 지 않 기 때문에 얻 은 결 과 는 그림 의 상하 비대 칭 이다.
중간 그림:

『8195』중간 에 있 는 그림 은 대칭 적 인 것 입 니 다.그러면 어떻게 얻 었 습 니까?앞에서 말 한 바 와 같이 회전의 중심 은(0,0)그림 의 대칭 점 에 있 지 않 기 때문에 우 리 는 회전 중심 을 대칭 점 에 두 기만 하면 된다.이것 은 preTranslate()와 post Translate()방법 을 말 해 야 한다.이 두 가지 방법 은 우리 가 말 하 는 회전 중심의 변 화 를 실현 할 수 있 지만 사실은 변 하지 않 고 그림 을 행렬 의 형식 으로 조작 할 뿐이다.회전 중심 이 바 뀌 는 것 과 같은 효 과 를 거 둘 뿐이다.

matrix.preTranslate(0, -bitmap.getHeight());
matrix.postTranslate(0,bitmap.getHeight());
이 두 줄 의 코드 가 바로 이런 역할 을 했다.preTranslate 방법의 역할 은 회전 하 는 사이 에 그림 을 위로 이동 시 키 는 것 이다.그러면 그림 은 x 축 대칭 에 관 한 것 이다.그 다음 에 회전 하 는 변 화 를 하 는 것 이다.post Translate 방법 은 변 경 된 후에 그림 을 아래로 이동 시 키 는 것 이다.그림 높이 의 절반 거 리 는 바로 원래 의 위치 로 돌아 가 는 것 이다.이렇게 그림 에 나타 난 결 과 는 대칭 적 이다.원리 도 간단 하 다.회전 중심 은(0,0)이다.단지 우리 가 그림 을 이동 할 뿐이다.이렇게 회전 변환 을 할 때 대칭 적 인 결 과 를 얻 을 수 있다.
작은 매듭
이 문 제 를 이해 하고 곽 신의 블 로 그 를 계속 보 러 갔다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기