2
我有一個覆蓋在相機預覽頂部的圖像。只需點擊一個按鈕,相機預覽就會在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;
}
我的問題是:如何在觸摸它拖到這個特殊的形象呢?觸摸相機預覽應該什麼也不做,只有觸摸圖像我應該可以拖動它。
提前致謝!