- 源码类别:SurfaceView
- 源码大小:727 KB
- 编码格式:gbk,utf8,不限
- 运行环境:php+mysql
最近一直在审视以前做过的东西,关于android摄像头预览,预览界面上呈现矩形框,在前文(
最近发现上层绘制矩形框,用surfaceview有点大材小用了。SurfaceView绘制动画更合适,只绘制个矩形框用ImageView足够了。但有些时候必须要用SurfaceView来实现。比如360手机安全卫士扫描二维码的实现应该就是通过上下两层SurfaceView实现的(见下图)。上层SurfaceView用于显示那个可以旋转的扫描示意框,底层SurfaceView预览摄像头视频。

废话不说了,稍候几天我会仿照上面360这个扫描二维码的界面做一个工程(结合PreviewCallback),公开出来。这次先谈用底层surfaceView+上层ImageView实现只拍摄矩形框中的图像。新建一个类继承ImageView,源码如下:
-
package yan.guoqi.rectphoto;
-
-
import android.content.Context;
-
import android.graphics.Canvas;
-
import android.graphics.Color;
-
import android.graphics.Paint;
-
import android.graphics.Paint.Style;
-
import android.graphics.Rect;
-
import android.util.AttributeSet;
-
import android.widget.ImageView;
-
-
public class DrawImageView extends ImageView{
-
-
public DrawImageView(Context context, AttributeSet attrs) {
-
super(context, attrs);
-
-
}
-
-
Paint paint = new Paint();
-
{
-
paint.setAntiAlias(true);
-
paint.setColor(Color.RED);
-
paint.setStyle(Style.STROKE);
-
paint.setStrokeWidth(2.5f);
-
paint.setAlpha(100);
-
};
-
-
@Override
-
protected void onDraw(Canvas canvas) {
-
-
super.onDraw(canvas);
-
canvas.drawRect(new Rect(100, 200, 400, 500), paint);
-
-
}
-
-
-
-
-
-
-
}
布局文件里与前文http://blog.csdn.net/yanzi1225627/article/details/8577756这里一样,只是在帧布局里加一个上面自定义的DrawImageView,整个布局文件示下:
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-
xmlns:tools="http://schemas.android.com/tools"
-
android:layout_width="fill_parent"
-
android:layout_height="fill_parent"
-
android:orientation="vertical" >
-
-
<TextView
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:text="@string/BestWish"
-
tools:context=".RectPhoto" />
-
-
<FrameLayout
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content" >
-
-
<SurfaceView
-
android:id="@+id/previewSV"
-
android:layout_width="fill_parent"
-
android:layout_height="800px" />
-
-
<yan.guoqi.rectphoto.DrawImageView
-
android:id="@+id/drawIV"
-
android:layout_width="fill_parent"
-
android:layout_height="800px"
-
/>
-
</FrameLayout>
-
-
<ImageButton
-
android:id="@+id/photoImgBtn"
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:background="@drawable/photo_img_btn"
-
android:layout_gravity="center" />
-
-
</LinearLayout>
在主程序文件里,onCreate()函数里设置底层SurfaceView为底层且透明(如果不设也可以,默认就是如此):
mPreviewSV.setZOrderOnTop(false);
mySurfaceHolder.setFormat(PixelFormat.TRANSPARENT);//translucent半透明 transparent透明
在主UI线程里的onCreate()函数里添加代码:
//绘制矩形的ImageView
mDrawIV = (yan.guoqi.rectphoto.DrawImageView)findViewById(R.id.drawIV);
mDrawIV.onDraw(new Canvas());
看上面的DrawImageView的函数里的onDraw,画的矩形是Rect(100, 200, 400, 500)。在onPictureTaken(byte[] data, Camera camera)函数里,先将图片旋转90度,大小成为宽×高(960×1280)。由于预览surfaceview的大小是宽×高(540×800),所以在onPictureTaken函数里将960×1280的图片缩放到540×800, 缩放相同大小后就可以用矩阵的坐标直接截取子图了。核心函数就是这两句:
//将960×1280缩放到540×800
Bitmap sizeBitmap = Bitmap.createScaledBitmap(rotaBitmap, 540, 800, true);
Bitmap rectBitmap = Bitmap.createBitmap(sizeBitmap, 100, 200, 300, 300);//截取
注意这个截取的函数参数和矩阵的坐标关系,分别是x轴 y轴起始坐标及 x轴宽度 y轴宽度。截取出来的图片大小应该是300×300. onPictureTaken()函数的源码如下:
-
本站资源仅限于学习研究,严禁从事商业或者非法活动!
源码搜藏网所有源码来自互联网转载与用户上传分享,如果侵犯了您的权益请与我们联系,我们将在24小时内删除!谢谢!