2014-02-20 47 views
5

我正在努力实现像动画(上下),在我正在编码的android运动应用程序的相机预览活动的扫描仪线。动画覆盖摄像头活动预览

我已成功使动画代码在单个活动中工作 - 无需预览相机。不管我怎么试过我在这里阅读过的所有关于stackoverflow或者搜索网络的东西,我总是得到相机预览,但是不会动画叠加。

这里是我的xml文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/container" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal" 
android:background="@android:color/transparent" 
android:layout_centerInParent="true"> 

<SurfaceView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/imageView" 
    android:src="@drawable/scanline" 
    android:contentDescription="@string/scanline" 
    android:layout_gravity="left|center_vertical" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentEnd="true" 
    android:background="@android:color/transparent" 
    android:baselineAlignBottom="false"/> 

<com.app.arsinoe.ui.widget.CameraPreview 
    android:id="@+id/camera_preview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@android:color/transparent" /> 

<Button 
    android:layout_width="156dp" 
    android:layout_height="27dp" 
    android:text="@string/exit_button" 
    android:id="@+id/aboardButton2" 
    android:layout_gravity="bottom|left" 
    android:clickable="true" 
    android:background="#4e0612" 
    android:textColor="@android:color/white" 
    android:textStyle="bold" 
    android:alpha="1" 
    android:paddingEnd="@dimen/activity_horizontal_margin" 
    android:paddingStart="@dimen/activity_vertical_margin" 
    android:onClick="exitButton"/> 

<Button 
    android:layout_width="310dp" 
    android:layout_height="27dp" 
    android:text="@string/scan_button" 
    android:id="@+id/scanButton" 
    android:layout_gravity="bottom|right" 
    android:clickable="true" 
    android:textColor="@android:color/white" 
    android:textStyle="bold" 
    android:alpha="1" 
    android:background="#1b4a6c" 
    android:paddingEnd="@dimen/activity_horizontal_margin" 
    android:paddingStart="@dimen/activity_vertical_margin" 
    android:onClick="scanButton"/> 
</FrameLayout> 

这里是扫描线的动画活动我的工作代码:

public class ScanActivity extends Activity{ 


private View view; 

protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.scan_activity); 

    final Context readySnanner = this; 
    Handler mHandler = new Handler(); 

    Runnable 
      makeToast = new Runnable() { 
     public void run() { 
      Toast.makeText(readySnanner, 
        "Bla bla bla...", Toast.LENGTH_LONG).show(); 
     } 
    }; 
    mHandler.postDelayed(makeToast, 4000); 


    Toast.makeText(ScanActivity.this,"Bla bla... Please wait",  Toast.LENGTH_SHORT).show(); 


    ImageView animatedImage = (ImageView) findViewById(R.id.imageView); 

    Animation animation 
      = AnimationUtils.loadAnimation(this, R.anim.topdown); 
    if (animation != null) { 
     animatedImage.startAnimation(animation);} 


    final int SPLASH_TIME;// 4 seconds 
    SPLASH_TIME = 4 * 1000; 


    boolean b; 
    b = new Handler().postDelayed(new Runnable() { 

     @Override 
     public void run() { 
     } 
    }, SPLASH_TIME); 
} 


public void exitButton(View view) { 

    this.finish(); 
    System.exit(0); 
} 

public void scanButton(View view) { 

    Intent intent = new Intent(ScanActivity.this, 
      B.class); 
    startActivity(intent); 
    ScanActivity.this.finish(); 
} 

下面是CameraActivity我的工作代码:

public class CameraActivity extends Activity { 

private Camera camera; 
private View view; 
SurfaceView animatedImage; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.scan_activity); 
    setResult(RESULT_CANCELED); 
    // Camera may be in use by another activity or the system or not available at all 
    try { 
     camera = getCameraInstance(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    if(cameraAvailable(camera)){ 
     initCameraPreview(); 
    } else { 
     finish(); 
    } 
} 

// Show the camera view on the activity 
private void initCameraPreview() { 
    CameraPreview cameraPreview = (CameraPreview) findViewById(R.id.camera_preview); 
    cameraPreview.init(camera);} 

我不知道如何使这两个活动作为一个单独的活动一起运行,使用提供d xml文件。请帮助新手,导致我在这些问题上停留了5天!

我很抱歉没有提供图片来描述我正在尝试编码的内容,但我的声望很低。任何答复,最好与工作样本,将不胜感激。

编辑

下图展示了活动的布局: enter image description here

红线应在动漫上下移动,ovelay相机预览。这是编码和在ImageView中工作,但不适用于CameraPreview。

这是我CameraPreview活动,编辑为Juan-devtopia.coop建议:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 

private Context context; 
private Camera camera; 

public CameraPreview(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public CameraPreview(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CameraPreview(Context context, Camera camera) { 
    super(context); 
    this.context = context; 
    this.camera = camera; 
} 

public void init(Camera camera) { 
    this.camera = camera; 
    initSurfaceHolder(); 
} 

@SuppressWarnings("deprecation") // needed for < 3.0 
private void initSurfaceHolder() { 
    SurfaceHolder holder = getHolder(); 
    if (holder != null) { 
     holder.addCallback(this); 
    } 
    if (holder != null) { 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    initCamera(holder); 
} 

private void initCamera(SurfaceHolder holder) { 
    try { 
     camera.setPreviewDisplay(holder); 
     camera.startPreview(); 
    } catch (Exception ignored) { 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
} 

public void setContext(Context context) { 
    this.context = context; 
} 


public class Animation extends Activity { 

    ImageView animatedImage = (ImageView) findViewById(R.id.imageView); 

    android.view.animation.Animation animation; 

    { 
     animatedImage.startAnimation(animation); 
     animation = AnimationUtils.loadAnimation(this, R.anim.topdown); 
    } 

} 

在编译和运行设备,在logcat中我得到一个“了java.lang.RuntimeException:无法实例化活动” ,由“引起:由java.lang.InstantiationException:com.app.myapp.ui.widget.CameraPreview引起的任何建议?

回答

2

ImageView放置在与预览相同的布局中,以便它呈现在然后将两个代码放在同一个活动中,即初始化相机预览的那个代码和在ImageView

CameraPreview视为另一个View从您的布局。

换句话说,你初始化你的相机预览,在你的代码,但还没有启动动画,让你的init相机的方法是这样的:

// Show the camera view on the activity and show overlay animation 
    private void initCameraPreview() { 
     CameraPreview cameraPreview = (CameraPreview) findViewById(R.id.view); 
     cameraPreview.init(camera); 


     ImageView animatedImage = (ImageView) findViewById(R.id.imageView); 
     Animation animation = AnimationUtils.loadAnimation(this, R.anim.rotate); 
     animatedImage.startAnimation(animation); 
    } 

注意,我改变了ID和动画,因为我不得不重新创建它来测试它。该布局仅包含表面和图像视图,将imageView进一步放置在代码中(意味着它将在上表面视图上呈现)。 enter image description here

在我的代码示例(我上传至Github上为您here)的ic_launcher简单地在相机预览旋转,但我相信使用你的动画,并确保它循环不仅动画一次,应该工作。

+0

谢谢Juan-devtopia.coop,为您解答。我会尝试按照您的建议编辑我的代码,如果一切正常,我会将您的答案标记为已接受。 – user3244633

+0

我试图按照你的建议编辑代码,但没有成功。我相信我的CameraPreview布局有问题,因为我没有该活动的显式布局。我应该创建一个具有ImageView和camera_preview布局的新xml作为FrameWork吗?你可以再次看看我发布的代码,就像我现在编辑的那样,添加CameraPreview活动? – user3244633

+0

为你上传了一个git示例项目,并编辑了我的问题,祝你的项目好运 –