【发布时间】:2016-05-05 13:35:07
【问题描述】:
我在相机预览上叠加了一张图片。单击按钮后,相机预览在 FrameLayout 内开始。单击另一个按钮时,图像也会覆盖在相机预览上。
下面是代码--
MainActivity:
public class MainActivity extends AppCompatActivity {
public Camera mCamera;
public CameraPreview mCameraPreView;
Bitmap bitmap;
FrameLayout frameLayout;
DrawOnTop drawOnTop;
FrameLayout.LayoutParams layoutParams;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
frameLayout = (FrameLayout)findViewById(R.id.camera_preview);
drawOnTop = null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void onCamViewButtonClicked (View view)
{
mCamera = getCameraInstance();
mCameraPreView = new CameraPreview(this,mCamera);
frameLayout.addView(mCameraPreView);
}
public Camera getCameraInstance()
{
Camera camera = null;
try
{
camera = Camera.open();
}
catch(Exception e)
{
e.printStackTrace();
}
return camera;
}
public void onOverlayImageButtonClicked(View view)
{
if(mCameraPreView == null)
{
Toast.makeText(getApplicationContext(),"Preview is not available now!",Toast.LENGTH_LONG).show();
return;
}
else {
if(drawOnTop != null)
{
frameLayout.removeView(drawOnTop);
drawOnTop = null;
}
else
{
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.internetothings);
drawOnTop = new DrawOnTop(this, bitmap);
layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER_HORIZONTAL;
frameLayout.addView(drawOnTop, layoutParams);
Toast.makeText(getApplicationContext(),"Click again to remove!",Toast.LENGTH_LONG).show();
}
}
}
}
CameraPreview.java:
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder surfaceHolder;
private android.hardware.Camera camera;
public CameraPreview (Context context, android.hardware.Camera cam)
{
super(context);
camera = cam;
surfaceHolder = getHolder();
surfaceHolder.addCallback(this);
}
public void surfaceCreated(SurfaceHolder holder)
{
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
public void surfaceDestroyed(SurfaceHolder holder)
{
camera.stopPreview();
camera.release();
camera = null;
}
public void surfaceChanged(SurfaceHolder holder,int format,int w,int h)
{
if(surfaceHolder.getSurface() == null)
{
return;
}
camera.stopPreview();
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
DrawOnTop.java:
public class DrawOnTop extends View {
Bitmap bitmap;
private int mActivePointerId = 9999;
public static float mLastTouchX,mLastTouchY,mPosX,mPosY;
ImageView view = null;
public DrawOnTop (Context context, Bitmap bmp)
{
super(context);
bitmap = bmp;
}
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
canvas.drawBitmap(bitmap, canvas.getWidth() / 2, canvas.getHeight() / 2, null);
}
}
我已使用以下代码进行拖动,但即使我触摸相机预览也会触发,这是我不想要的。
public boolean onTouchEvent(MotionEvent event)
{
int action = event.getActionMasked();
switch (action)
{
case MotionEvent.ACTION_DOWN:
{
int pointerIndex = event.getActionIndex();
final float x = MotionEventCompat.getX(event, pointerIndex);
final float y = MotionEventCompat.getY(event, pointerIndex);
mLastTouchX = x;
mLastTouchY = y;
mActivePointerId = event.getPointerId(pointerIndex);
break;
}
case MotionEvent.ACTION_MOVE:
{
final int pointerIndex =
MotionEventCompat.findPointerIndex(event, mActivePointerId);
final float x = MotionEventCompat.getX(event, pointerIndex);
final float y = MotionEventCompat.getY(event, pointerIndex);
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
invalidate();
mLastTouchX = x;
mLastTouchY = y;
break;
}
case MotionEvent.ACTION_UP:
{
mActivePointerId = 9999;
break;
}
case MotionEvent.ACTION_CANCEL:
{
mActivePointerId = 9999;
break;
}
case MotionEvent.ACTION_POINTER_UP:
{
final int pointerIndex = MotionEventCompat.getActionIndex(event);
final int pointerId = MotionEventCompat.getPointerId(event, pointerIndex);
if (pointerId == mActivePointerId) {
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = MotionEventCompat.getX(event, newPointerIndex);
mLastTouchY = MotionEventCompat.getY(event, newPointerIndex);
mActivePointerId = MotionEventCompat.getPointerId(event, newPointerIndex);
}
break;
}
}
return true;
}
我的问题是:如何在触摸此特定图像时拖动它?触摸相机预览应该什么都不做,只有触摸图像我才能拖动它。
提前致谢!
【问题讨论】:
标签: android canvas android-camera surfaceview touch-event