2013-07-22 95 views
2

我正在使用canvas的應用程序。我正在使用自定義圖像視圖。但是當我嘗試運行該應用程序時,出現錯誤。我寫的代碼如下Classcast處理自定義圖像視圖時出現異常

private static MyView myimageView; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);  

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 
      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
      myimageView = (MyView) findViewById(R.id.myView); 

      Cursor cursor = getContentResolver().query(selectedImage, 
        filePathColumn, null, null, null); 
      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String picturePath = cursor.getString(columnIndex); 
      cursor.close(); 

      myimageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
      Intent i = getIntent();  
      loc = i.getFloatArrayExtra("Location"); 
      myimageView.buildDrawingCache(); 

      bmp1 = Bitmap.createBitmap(myimageView.getDrawingCache()); 
      bmp2 = Bitmap.createBitmap(myimageView.getDrawingCache()); 


     } 


    } 

    public static class MyView extends ImageView implements OnTouchListener{ // or some other View-based class 
      public MyView(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 
     } 

      MyView(Context context, AttributeSet attrs) { 
       super(context, attrs); 
      } 

      MyView(Context context, AttributeSet attrs, int defStyle) { 
       super(context, attrs, defStyle); 
      } 

     boolean drawRectangle = false; 
      PointF beginCoordinate; 
      PointF endCoordinate; 



      public boolean onTouch(View v, MotionEvent event) { 
       // TODO Auto-generated method stub 
       int count=1; 

       if(event.getAction() ==MotionEvent.ACTION_DOWN) { 


        if (count==1){ 

         x1 = event.getX(); 
         y1 = event.getY(); 



         System.out.println(count+"count of value a;skd"); 

         Log.i(TAG, "coordinate x1 : "+String.valueOf(x1)+" y1 : "+String.valueOf(y1)); 
        } 
       } 
        else if(event.getAction() ==MotionEvent.ACTION_MOVE){ 
         invalidate(); 
         // imageView.setImageBitmap(bmp2); 
         x2 = event.getX(); 
         y2 = event.getY(); 
         posX=(float)(x1+x2)/2; 
         posY=(float)(y1+y2)/2; 
         radius=(float) Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))/2; 
         // onDraw(); 
          } 
       if(event.getAction() ==MotionEvent.ACTION_UP) 
        { 
        invalidate(); 
        // onDraw(); 
         //bmp2=bmp; 
         if(action==2) 
         { 


        } 
        } 





       return true; 

      } 

      public void onDraw(){ 
       bmp = Bitmap.createBitmap(myimageView.getWidth(), myimageView.getHeight(), Config.ARGB_8888); 
       c = new Canvas(bmp); 
       myimageView.draw(c); 
       Paint pnt = new Paint(); 
       pnt.setColor(Color.BLUE); 
       pnt.setStyle(Paint.Style.STROKE); 
       pnt.setStrokeWidth(3); 
      if(action==1) 
      { 

       c.drawCircle(posX,posY, radius, pnt); 
       pnt.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
       myimageView.setImageBitmap(bmp); 
       i = 1; 
      }else{ 

       float h=(float) 30.0; 

       float phi = (float) Math.atan2(y2 - y1, x2 - x1); 
       float angle1 = (float) (phi - Math.PI/6); 
       float angle2 = (float) (phi + Math.PI/6); 

       float x3 = (float) (x2 - h * Math.cos(angle1)); 
       float x4 = (float) (x2 - h * Math.cos(angle2)); 
       float y3 = (float) (y2 - h * Math.sin(angle1)); 
       float y4 = (float) (y2 - h * Math.sin(angle2)); 

       c.drawLine(x1, y1,x2,y2 ,pnt); 
       c.drawLine(x2, y2,x3,y3 ,pnt); 
       c.drawLine(x2, y2,x4,y4 ,pnt); 



       myimageView.setImageBitmap(bmp); 
       i=1; 
      } 
      } 

      } 





} 

,並在我的xml文件,我得到的錯誤是:

<ImageView class= "com.infy.DrawActivity$MyView" 
    android:id="@+id/myView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1.01" 
    android:src="@drawable/ic_launcher" />   

和日誌貓:

07-23 10:47:13.098: E/AndroidRuntime(815): FATAL EXCEPTION: main 
07-23 10:47:13.098: E/AndroidRuntime(815): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://media/external/images/media/29 }} to activity {com.infy/com.infy.DrawActivity}: java.lang.ClassCastException: android.widget.ImageView cannot be cast to com.infy.DrawActivity$MyView 
07-23 10:47:13.098: E/AndroidRuntime(815): at android.app.ActivityThread.deliverResults(ActivityThread.java:2980) 
07-23 10:47:13.098: E/AndroidRuntime(815): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3023) 
07-23 10:47:13.098: E/AndroidRuntime(815): at android.app.ActivityThread.access$1100(ActivityThread.java:123) 
07-23 10:47:13.098: E/AndroidRuntime(815): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177) 
07-23 10:47:13.098: E/AndroidRuntime(815): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-23 10:47:13.098: E/AndroidRuntime(815): at android.os.Looper.loop(Looper.java:137) 
07-23 10:47:13.098: E/AndroidRuntime(815): at android.app.ActivityThread.main(ActivityThread.java:4424) 
07-23 10:47:13.098: E/AndroidRuntime(815): at java.lang.reflect.Method.invokeNative(Native Method) 
07-23 10:47:13.098: E/AndroidRuntime(815): at java.lang.reflect.Method.invoke(Method.java:511) 
07-23 10:47:13.098: E/AndroidRuntime(815): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
07-23 10:47:13.098: E/AndroidRuntime(815): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
07-23 10:47:13.098: E/AndroidRuntime(815): at dalvik.system.NativeStart.main(Native Method) 
07-23 10:47:13.098: E/AndroidRuntime(815): Caused by: java.lang.ClassCastException: android.widget.ImageView cannot be cast to com.infy.DrawActivity$MyView 
07-23 10:47:13.098: E/AndroidRuntime(815): at com.infy.DrawActivity.onActivityResult(DrawActivity.java:153) 
07-23 10:47:13.098: E/AndroidRuntime(815): at android.app.Activity.dispatchActivityResult(Activity.java:4649) 
07-23 10:47:13.098: E/AndroidRuntime(815): at android.app.ActivityThread.deliverResults(ActivityThread.java:2976) 
07-23 10:47:13.098: E/AndroidRuntime(815): ... 11 more 
+1

引起:java.lang.ClassNotFoundException:com.infy.DrawActivity.myView <---一切都在AndroidManifest.xml內? – bofredo

+0

是的,它與充氣myView類 – user2586488

+0

這是一個內部類的權利?嘗試像這樣引用它:'com.infy.DrawActivity $ myView' http://stackoverflow.com/questions/2098318/error-referencing-an-inner-class-view-in-layout-main-xml –

回答

2

它是DrawActivity的內部類,因此您需要像在XML中一樣引用它:

<view class="com.infy.DrawActivity$myView" 
    android:id="@+id/myView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1.01" 
    android:src="@drawable/ic_launcher" /> 

在這裏看到:Error referencing an inner class View in layout/main.xml

或者,將其移動到它自己的類。

+0

嗨,我仍然收到錯誤。我得到一個類拋出異常。 logcat說不能轉換部件。 imageview to drawactivit $ MyView.Could你可以幫我解決這個問題。 – user2586488

+0

你可以用最新的代碼問一個新問題嗎?現在非常混亂,這會讓人們更容易幫助你解決這個特定的問題。奇怪的是它引用'MyView'的大寫'm',但我在代碼中沒有看到任何地方...... –

+0

嗨,我不能問一個新問題。我再次編輯了整個問題。你可以看看它嗎 – user2586488

1

定義類的公共靜態,並添加所有必要查看構造

public static class myView extends ImageView { 
    myView(Context context) { 
     super(context); 
    } 

    myView(Context context, AttributeSet attrs) { 
     super(context, attrs) 
    } 

    myView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

而且像這樣引用它

<view class="com.infy.DrawActivity$myView" 
    android:id="@+id/myView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1.01" 
    android:src="@drawable/ic_launcher" /> 

提示:根據Java約定類名應大寫字母開頭。

1

嘗試增加

myView(Context context, AttributeSet attrs) and myView(Context context, AttributeSet attrs, int defStyle)

在您的自定義ImageView的。

+0

你是對的。但這不是主要的崩潰問題。它會在OP修復ClassNotFoundException之後出現。 –

+0

嗨,你是對的。但現在我得到一個類拋出異常。 logcat說不能轉換部件。 imageview來drawactivit $ MyView。 – user2586488

+0

'class cast exception'是由於您正在使用內部類進行查看。 爲您的視圖在同一個文件或其他文件中創建一個單獨的類,並在'xml'中更改路徑。 –