在surfaceView上添加一个矩形框的功能

这几天看了很多大神写的在surfaceView上添加一个矩形框的功能 ,我自己也写了一个类似的简单功能实现,目前还有个技术难题没有实现,有那个大神看到这篇文章麻烦现身指点一二,别的不多说了 代码先贴出来,问题后面在问!

先写一个相机类:(我有一部分是用afinal快速框架开发的,比较方便,推荐大家都使用下!)

package com.example.cameratest;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


import net.tsz.afinal.FinalActivity;
import net.tsz.afinal.annotation.view.ViewInject;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;


public class CameraActivity extends FinalActivity {


	@ViewInject(id = R.id.buttonLayout)View layout;
	@ViewInject(id = R.id.surfaceview,click = "focusing")SurfaceView surfaceView;


	private Camera camera;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
//        layout.getBackground().setAlpha(150);//这里可以给背景添加透明度
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceView.getHolder().setFixedSize(640, 480);
        surfaceView.getHolder().setKeepScreenOn(true);
        surfaceView.getHolder().addCallback(new SurfaceCallBack());
    }
    
    /**
     * 拍照点击事件
     * @param view
     */
    public void takepicture(View view){
    	if(camera!=null){
    		camera.takePicture(null, null, new MypictureCallback());
    	}
    }
    /**
     * 聚焦点击事件
     * @param view
     */
    public void focusing(View view){
    	if(camera!=null){
    		camera.autoFocus(new MyAutoFocusCallback());
    	}
    }
    
    /**
     * 聚焦点击事件内部类
     * @author wanglei
     *
     */
    private final class MyAutoFocusCallback implements AutoFocusCallback{


		@Override
		public void onAutoFocus(boolean success, Camera camera) {
			// TODO Auto-generated method stub
			if(success){
				Log.i("main", "对焦完成");
				camera.takePicture(null, null, new MypictureCallback());
			}else{
				Log.i("main", "对焦else");
			}
		}
    	
    }
    
    /**
     * 拍照事件内部类
     * @author wanglei
     *
     */
    private final class MypictureCallback implements PictureCallback{


		@Override
		/**
		 * @param data 传过来的jpg
		 * @param camera 摄像头
		 */
		public void onPictureTaken(byte[] data, Camera camera) {
			try {
				File jpgFile = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
				FileOutputStream outputStream = new FileOutputStream(jpgFile);
				outputStream.write(data);
				outputStream.close();
				camera.startPreview();//开始预览
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
    }
    
    /**
     * 打开相机内部类
     * @author wanglei
     *
     */
    private final class SurfaceCallBack implements Callback{
    	@Override
    	public void surfaceCreated(SurfaceHolder holder) {
    		try {
				camera = Camera.open(); //打开摄像头
				Camera.Parameters parameters = camera.getParameters();
//    			Log.i("main", "摄像头的各项参数:"+parameters.flatten());
				parameters.setPreviewSize(640, 480);//摄像头的像素
//				parameters.setPreviewFrameRate(5);//摄像头每秒获得5个画面
				parameters.setPictureSize(640, 480);//拍摄出照片的大小
				parameters.setPictureFormat(PixelFormat.JPEG);
				parameters.setJpegQuality(100);//jpg图片的质量
				parameters.setRotation(90);//相机旋转90度
				camera.setParameters(parameters);//把参数设回给摄像头
				camera.setPreviewDisplay(holder);//设置显示摄像头捕获的画面
				camera.setDisplayOrientation(90);//旋转90度解决相机反向问题
				camera.startPreview();//开始预览
				
			} catch (IOException e) {
				e.printStackTrace();
			}
    		
    	}
    	@Override
    	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    		
    	}
    	@Override
    	/**
    	 * 关闭摄像头
    	 */
    	public void surfaceDestroyed(SurfaceHolder holder) {
     		if(camera!=null){
     			camera.stopPreview();
     			camera.release();
     			camera = null;
     			Log.i("main", "摄像头关闭");
     		}
    	}
    }
}

然后是在上面层的view类:

package com.example.cameratest;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;


public class MyView extends View {


	private int x = 50;
	private int y = 50;
	private int w = 210;
	private int h = 150;


	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		setLongClickable(true);
		this.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
//就是这里 各位大神 我想写个类似于系统自带的图片裁剪框的那个功能 不知怎么实现
				v.invalidate();
				return false;
			}
		});
	}


	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		Paint paint = new Paint(); // 笔触
		paint.setAntiAlias(true); // 反锯齿
		paint.setColor(Color.WHITE);
		paint.setStyle(Paint.Style.STROKE);
		paint.setStrokeWidth(5);
		canvas.drawRect(x, y, w, h, paint);
		Log.i("mian", "--------->>执行: x=" + x + " | y=" + y +" | w="+ w + " | h=" + h);
		super.onDraw(canvas);
	}
}


布局文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF" >


    <SurfaceView
        android:id="@+id/surfaceview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <RelativeLayout
        android:id="@+id/buttonLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" ><!-- 布局这里可以添加背景 -->


        <com.example.cameratest.MyView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>


</FrameLayout>

清单文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.cameratest"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />


    <!-- 访问照相机的权限 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- sd卡读写数据目录的权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 自动对焦的权限 -->
    <uses-feature android:name="android.hardware.camera.autofocus" />


    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main"
            android:theme="@android:style/Theme.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- android:screenOrientation:固定屏幕显示方向 -->
        <activity
            android:name=".CameraActivity"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar" >
        </activity>
    </application>


</manifest>
各位大神我想在view的基础上添加个类似于android系统在带的图片裁剪框,可以手动调整大小的那种,希望能给点思路!谢谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值