2011-04-04 62 views
0

我想从sdcard中将图片加载到我的视图中,然后绘制它。到目前为止,我可以拍摄照片并在图像视图中显示它后,我已经在位图上绘制了一个圆圈,但这不是应该如何完成的。我认为我需要创建一个自定义视图类并重写它的onDraw()。 Atm我有一个与surfaceview相关的布局,在surfaceview后我有imageview和按钮。我的问题是,如果我编写一个自定义视图类来处理绘图,然后我将它传递给我的活动的setContent视图,令我困惑的是,如果布局是通过xml文件声明式声明的,我如何设置活动的setContentView( )到处理绘图的自定义视图类?如何以声明方式设置contentview或使用customview类

感谢垫

[编辑]

这里的XML布局我使用。这不是我应该如何使用imageview来做到的。

<?xml version="1.0" encoding="UTF-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" android:layout_width="match_parent" 
       android:layout_height="wrap_content" android:gravity="fill"> 



    <ImageView android:id="@+id/imageView1" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"></ImageView> 

       <com.tecmark.HorizontalSlider android:id="@+id/slider" 
       android:indeterminateOnly="false" 
       android:progressDrawable="@android:drawable/progress_horizontal" 
       android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal" 
       android:minHeight="20dip" 
       android:maxHeight="20dip" android:layout_width="fill_parent" 
       android:layout_height="wrap_content"/> 



</RelativeLayout>    




public class LoadPic extends Activity{ 

    private static final String TAG = "Loadpic"; 
    private ImageView imageview; 
    private File tempFile; 
    private byte[] imageArray; 
    private HorizontalSlider slider; 
    private Canvas canvas; 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Log.e(TAG, " loadpic onCreate"); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
          WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.load2); 
     setProgressBarVisibility(true); 
     slider = (HorizontalSlider) this.findViewById(R.id.slider); 
     slider.setOnProgressChangeListener(changeListener); 


     imageview = (ImageView)findViewById(R.id.imageView1); 

     tempFile = new File(Environment.getExternalStorageDirectory(). 
      getAbsolutePath() + "/"+"image.jpg"); 

     imageArray = new byte[(int)tempFile.length()]; 

    try{ 

     InputStream is = new FileInputStream(tempFile); 
     BufferedInputStream bis = new BufferedInputStream(is); 
     DataInputStream dis = new DataInputStream(bis); 


     int i = 0; 

     while (dis.available() > 0) { 
     imageArray[i] = dis.readByte(); 
     i++; 
     } 

     dis.close(); 

    } catch (Exception e) { 

      e.printStackTrace(); 
     } 

     BitmapFactory.Options bfo = new BitmapFactory.Options(); 
     bfo.inSampleSize = 5; 
     Bitmap bm = BitmapFactory.decodeByteArray(imageArray, 0, imageArray.length, bfo); 
     Log.e(TAG, bm.toString()); 
     //imageview.setImageBitmap(bm); 


     Bitmap bmOverlay = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig()); 
     canvas = new Canvas(bmOverlay); 
     Paint paint = new Paint(); 
     paint.setColor(Color.RED); 
     paint.setStrokeWidth(1); 
     paint.setStyle(Paint.Style.STROKE); 



     canvas.drawBitmap(bm, new Matrix(), null); 
     canvas.drawCircle(50, 50, 25, paint); 
     imageview.setImageBitmap(bmOverlay); 






    }// end of onCreate 


    private OnProgressChangeListener changeListener = new OnProgressChangeListener() { 




        @Override 
        public void onProgressChanged(View v, int progress) { 
         // TODO Auto-generated method stub 
         setProgress(progress); 

        } 



      }; 


}//end of Activity 

我在想什么是创建一个customview类来处理位图上的绘图。但是,如果我这样做,那么如何使setContentView()指向我的customView类指向xml文件时。对不起,如果我错过了这里的东西

+0

你可以在的setContentView [http://developer.android.com/reference/android/直接设置你的看法app/Activity.html#setContentView(android.view.View)] func。 – mudit 2011-04-04 11:56:29

+0

@mudit嗨,是的,这是我使用。我将布局资源传递给setcontview()。这是在xml文件中声明的,并创建了我想要的视图。我现在要做的是创建一个处理位图绘制的自定义视图类,但是如果我将contentview()设置为此类,则无法在res/layout/main.xml中使用布局文件。 – turtleboy 2011-04-04 12:11:10

+0

请告诉我你想要哪一个:要么将位图设置为视图的背景,要么添加视图加上xml文件,或者想要将自定义视图添加到当前布局中? – mudit 2011-04-04 12:22:20

回答

0

如果你想为位图和绘图定制视图,那么你可以简单地扩展ImageView并覆盖paint方法。类似的东西:

public class MyImage extends ImageView { 
    ... 
    @Override 
    public void paint(...){} 
} 

而在XML布局改变的ImageView到

<what.ever.package.MyImage ... /> 
+0

谢谢,但我认为imageview可能是一个不好的选择,因为它在android文档中说,如果我经常打电话onDraw()我需要使用画布 – turtleboy 2011-04-04 14:04:36

相关问题