마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

[부탁드려요] ImageView 위에 paint로 그리기 문의입니다. (소스있어요)

0 추천

서명하는 부분을 만들고 있는데, 뒷 배경이있어서 이미지뷰를 사용했습니다.

레이아웃은

<RelativeLayout 

        android:id="@+id/sign_btn_layout01"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:layout_marginTop="128dp">

        

        <LinearLayout 

            android:id="@+id/sign_btn_layout02"

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:orientation="vertical">

            

        <ImageView 

            android:id="@+id/sign_img"

            android:layout_width="fill_parent"

            android:layout_height="157dp"

            android:src="@drawable/sign"/>

        

        <Button 

            android:id="@+id/btn_sign_again"

            android:layout_width="wrap_content"

            android:layout_height="50dp"

            android:layout_marginTop="2dp"

               android:background="@drawable/set_btn_retry_sign" />

        

        </LinearLayout>

    </RelativeLayout>

 

이렇게 되어 있구요.

 

소스상에서는 

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.sign_activity);

        canvas = new Canvas();

        signPaint = new Paint();

        signPaint.setAntiAlias(true);

        signPaint.setDither(true);

        signPaint.setColor(Color.BLACK);

        signPaint.setStyle(Paint.Style.STROKE);

        signPaint.setStrokeWidth(12);

        

        /** 화면 표현 관련 초기 설정 및 표현  */

        setDisplay();        

        /** 이벤트 관련 등록 및 초기 설정 */

        setEventListener();

}

 

으로 만들어 져있습니다. 이벤트 리스너 안에서 이미지뷰.onTouchListener(this); 를 했구요.

그리고

@Override

    public void onWindowFocusChanged(boolean hasFocus) {

        // TODO Auto-generated method stub

        super.onWindowFocusChanged(hasFocus);

        

        width=signView.getWidth();

        height=signView.getHeight();

 

        Log.e("heightttt",""+height);

        Log.e("Widthhhh",""+width);

        

    }

    

    public boolean onTouch(View v, MotionEvent event) {

        int action = event.getAction();

        switch (action) {

        case MotionEvent.ACTION_DOWN:

          downx = event.getX();

          downy = event.getY();

          break;

        case MotionEvent.ACTION_MOVE:

          break;

        case MotionEvent.ACTION_UP:

          upx = event.getX();

          upy = event.getY();

          canvas.drawLine(downx, downy, upx, upy, signPaint);

          signView.invalidate();

          break;

        case MotionEvent.ACTION_CANCEL:

          break;

        default:

          break;

        }

        return true;

      }

 

이렇게 작성했는데, 로그에 

02-26 01:12:51.631: E/AndroidRuntime(10234): Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.ImageView

 

이렇게 뜹니다.

아 도대체 뭐가 잘못되어있는지 모르겠어요ㅠㅠㅠㅠㅠㅠ....

도움 좀 꼭 부탁드려요ㅠㅠㅠㅠ

쮸뿌쮸뿌 (2,470 포인트) 님이 2016년 2월 26일 질문

1개의 답변

0 추천
어디부터 어떻게 설명해야할지 모르겠지만...

일단 오류는 LinearLayout 을 ImageView로 캐스팅할수없다는 겁니다...

어디선가 뷰를 잘 못 사용하신거 같아요...
비애천사 (12,080 포인트) 님이 2016년 2월 26일 답변
LinearLayout안에서 ImageView 를 사용할 수 없다는건가요
아뇨...
작성자분이 올리신 오류는...
ImageView iv = new ImageView();
LinearLayout ll = (LinearLayout) iv;
이렇게 했을때 생기는 오류라는 거죠.
아직도 해결을 못햇어요ㅠㅠㅠㅠㅠㅠ이미지뷰에 사인을 올릴수는 있는거죠ㅠㅠ...하..
제생각엔 가능할꺼 같은데요....
문제는 ID를 잘못할당하신게 아닌가 싶은데....

아마도 ImageView(sign_img)와 같은 크기의 Bitmap을 만든 후 이 Bitmap을 Canvas와 연결하고,
ImageView에 터치이벤트가 들어오면 Canvas를 통해 Bitmap에 그림을 그린 후 ImageView에 set 해주시는 형태가 아닐까 싶은데요...
흐름은 별 문제 없어 보입니다.

위에서도 말씀드렸다싶이 올리신 오류는 단순 캐스팅오륩니다.
View ID를 잘 확인해보시거나 혹시 리소스가 꼬였을 수 있으니 클린 후 리빌드 해보세요.
감사합니다. 아직 확인을 못해봐서요..감사해요!!할 수 있을거예요ㅠㅠㅠㅠ
...