1.自定义一个imageview用来设定surfaceview上的特定区域。

public class DrawImageView extends ImageView {

private Paint paint;

private int mFristPointX = 100, mFristPointY = 200;

private int mSecondPointX = 400, mSecondPointY = 500;

private boolean isFirstDown = true;

private int mOldX = 0, mOldY = 0;

public DrawImageView(Context context) {

super(context);

// TODO Auto-generated constructor stub

init();

}

public DrawImageView(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

init();

}

private void init() {

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) {

// TODO Auto-generated method stub

super.onDraw(canvas);

canvas.drawRect(new Rect(getmFristPointX(), getmFristPointY(), getmSecondPointX(), getmSecondPointY()), paint);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

// TODO Auto-generated method stub

if (event.getAction() != MotionEvent.ACTION_UP) {

int x = (int) event.getX();

int y = (int) event.getY();

Rect mRect = new Rect(getmFristPointX(), getmFristPointY(), getmSecondPointX(), getmSecondPointY());

if (mRect.contains(x, y)) {

if (isFirstDown) {

mOldX = x;

mOldY = y;

isFirstDown = false;

} else {

int mXDis = x - mOldX;

int mYDis = y - mOldY;

mOldX = x;

mOldY = y;

ReSetVaue(mXDis, mYDis);

}

}

} else {

isFirstDown = true;

}

return true;

}

public void setValue(int x, int y) {

setmFristPointX(x - 50);

setmFristPointY(y - 50);

setmSecondPointX(x + 50);

setmSecondPointY(y + 50);

invalidate();

}

public void ReSetVaue(int xDis, int yDis) {

setmFristPointX(getmFristPointX() + xDis);

setmFristPointY(getmFristPointY() + yDis);

setmSecondPointX(getmFristPointX() + 100);

setmSecondPointY(getmFristPointY() + 100);

invalidate();

}

public int getmFristPointX() {

return mFristPointX;

}

public void setmFristPointX(int mFristPointX) {

this.mFristPointX = mFristPointX;

}

public int getmFristPointY() {

return mFristPointY;

}

public void setmFristPointY(int mFristPointY) {

this.mFristPointY = mFristPointY;

}

public int getmSecondPointX() {

return mSecondPointX;

}

public void setmSecondPointX(int mSecondPointX) {

this.mSecondPointX = mSecondPointX;

}

public int getmSecondPointY() {

return mSecondPointY;

}

public void setmSecondPointY(int mSeconPointY) {

this.mSecondPointY = mSeconPointY;

}

}

2.定义xml布局。

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1" >

android:id="@+id/open_camera"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_marginLeft="30dp"

android:layout_marginRight="30dp"

android:layout_marginTop="15dp" />

android:id="@+id/draw_rect"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_marginLeft="30dp"

android:layout_marginRight="30dp"

android:layout_marginTop="15dp" />

3.在surfaceChanged中设置参数开始画区域:

DrawImageView.onDraw(new Canvas());

DrawImageView.setValue(mFirstPointX, mFirstPointY);//左上角点的值

4.在camera拍照部分进行压缩裁剪。

private Bitmap mBitmap;

private Camera.PictureCallback takePictureCallback = new Camera.PictureCallback() {

@Override

public void onPictureTaken(byte[] data, Camera camera) {

// TODO Auto-generated method stub

if (data != null) {

mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

camera.stopPreview();

}

Matrix matrix = new Matrix();

matrix.setRotate(90);

Bitmap rotaBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, false);

getSurfaceSize();

Bitmap sizeBitmap = Bitmap.createScaledBitmap(rotaBitmap, SurView_Width, SurView_Height, true);

SaveBitmap(sizeBitmap);

mFirstPointX = mDrawImageView.getmFristPointX() + 50;

mFirstPointY = mDrawImageView.getmFristPointY() + 50;

Bitmap newBitmap = Bitmap.createBitmap(sizeBitmap, mFirstPointX - 50, mFirstPointY - 50, 100, 100);

if (newBitmap != null) {

mTestImageView.setImageBitmap(newBitmap);

}

camera.startPreview();

}

};

private void getSurfaceSize(){

SurView_Width = mSurfaceView.getWidth();

SurView_Height = mSurfaceView.getHeight();

}

private void SaveBitmap(Bitmap bitmap) {

File mpicture = new File(mPath + File.separator + "pic.jpg");

try {

mpicture.createNewFile();

BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(mpicture));

bitmap.compress(CompressFormat.JPEG, 75, outputStream);

outputStream.flush();

outputStream.close();

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

}

参考文献:  http://blog.csdn.net/yanzi1225627/article/details/8580034

android自定义camera预览区域,android camera摄像surfaceview预览界面特定区域(该区域可移动)...相关推荐

  1. java数字时钟代码,Android自定义数字时钟代码,android自定义时钟,package jp.t

    Android自定义数字时钟代码,android自定义时钟,package jp.tpackage jp.tsmsogn.digitalclock;import java.util.Calendar; ...

  2. android自定义游戏闯关图,Android自定义View(四) -- Canvas

    本文计划根据HenCoder系列文章进行学习,所以代码风格及博文素材可能会摘自其中. 1 范围裁切 范围裁切有两个方法: clipRect() 和 clipPath().裁切方法之后的绘制代码,都会被 ...

  3. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  4. android 自定义绘画,【整理】Android 自定义视图之画图

    Android 自定义视图之画图 首先简单的一个画矩形的例子 public class DrawView extends View { public DrawView(Context context) ...

  5. android 自定义 build.gradle,Gradle for Android 第二篇( Build.gradle入门 )

    这一系列暂不更新,相关技术讨论,请移步微信群,谢谢,希望大家多多支持! 新年新气象,奋斗的一年,在这一章,我们将学习以下内容: 理解Gradle文件 编写简单的构建任务 自制构建脚本 如果你还没有看g ...

  6. android 自定义加载动画效果,Android自定义View实现loading动画加载效果

    项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...

  7. android自定义水平长方形进度条,Android 自定义水平进度条的圆角进度

    有时项目中需要实现水平圆角进度,如下两种,其实很简单 下面开始看代码,先从主界面布局开始看起: xmlns:tools="http://schemas.android.com/tools&q ...

  8. android 自定义音乐圆形进度条,Android自定义View实现音频播放圆形进度条

    本篇文章介绍自定义View配合属性动画来实现如下的效果 实现思路如下: 根据播放按钮的图片大小计算出圆形进度条的大小 根据音频的时间长度计算出圆形进度条绘制的弧度 通过Handler刷新界面来更新圆形 ...

  9. Android自定义睡眠下表统计图,Android 进阶自定义View(5)图表统计PieChartView圆饼图的实现...

    今天讲图表统计中比较常用的一个,像支付宝的月账单啥的,都是用圆饼图来做数据统计的,先看一下我最终实现的效果图: image.png 该效果实际上是两个实心圆叠加后的效果. image.png imag ...

  10. android自定义侧滑菜单代码,原生Android 侧滑菜单实践(部分)

    此为第一个制作侧滑菜单的实践 . 此部分仅仅为部分实践: 仅缺menu的字符串布局,以及需要修改的MainActivity.java文件,也是需要主要修改的地方. 从使用MD设计-进行侧滑菜单的制作( ...

最新文章

  1. 鲜为人知的object-fit属性,让您的img图片不再因为固定宽高而被拉伸压缩
  2. [小技巧] gcc attribute error 属性小试
  3. vscode使用教程python-使用VS Code进行Python编程
  4. 时间日期类JAVA包含地区属性_Java常用类 | 时间和日期类
  5. Bug in Code CodeForces - 420C (计数,图论)
  6. 请领导审阅并提意见应怎么说_职场中,领导不喜欢你,暗中排挤你,怎么办?老员工给你支5招!...
  7. 从好买辞职后,为什么我会加入一家开源创业公司?
  8. 工具类集和_gblfy版本
  9. 500万人“动口”收蚂蚁森林能量!天猫精灵发布语音“云种树”报告
  10. linux/ubuntu下简单好用的python opencv安装教程 ( 解决 imshow, SIFT, SURF, CSRT使用问题)
  11. 【神器】截图+贴图工具 Snipaste
  12. 必看!超详细的电子元器件选型经验分享
  13. Java数据脱敏框架
  14. 连接共享打印机时提示无法访问计算机,win10共享打印机提示无法访问.你可能没有权限使用网络资源怎么解决...
  15. matlab 线透明度,matlab 曲线填充 透明度
  16. 登录邮箱用哪个好,好用的登录邮箱推荐
  17. 昆明oracle考试点,Oracle认证考试知识点:修改sid的步骤
  18. Habor镜像仓库的搭建
  19. 2022届测开秋招面经全记录
  20. 外国用户和国内用户看待浏览器的问题

热门文章

  1. shell循环生成日期
  2. VIVADO 中的几种仿真选项以及功能仿真、前仿真、后仿真、时序仿真
  3. nuke py 笔记
  4. MySQL充电_Mysql 充电站SQL查询1--171221--mysql-sql
  5. [二分答案] P2920 Time Management
  6. 移花接木—做一个简单的软件渲染器
  7. 魏永明:从MiniGUI看嵌入式十年收获与失去
  8. Python下划线用法
  9. 为什么这么多人用代理IP,使用代理IP的效果怎么样
  10. 无盘服务器网线怎么插,宽带师傅教你怎么安装网线插座 看完自己都会了!