android中Surfaceview挡住Animation的控件

牛_弹琴 2012-08-27 05:47:26
在做一个android项目的时候需要使用摄像头当北京,在屏幕的下方有一些按钮,这些按钮有仿照Path的效果。所以布局的顶层用了一个FrameLayout,里面有一个SurfaceView用于显示摄像头背景,RelativeLayout用于管理按钮,在代码中为每个按钮增加了TranslateAnimation来移动按钮的位置,当调用Button的startAnimation时,按钮竟然都不见了


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<SurfaceView
android:id="@+id/lo"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<Button
android:id="@+id/search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/one" />

<Button
android:id="@+id/mycollect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/two" />

<Button
android:id="@+id/sending"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/three" />

<Button
android:id="@+id/mypaopao"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/four" />

<Button
android:id="@+id/setting"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/five" />

<Button
android:id="@+id/menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/menu" />
</RelativeLayout>

</FrameLayout>


package com.piaoxin;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.Display;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.TranslateAnimation;
import android.widget.Button;

public class PiaoXin extends Activity implements OnTouchListener,SurfaceHolder.Callback
{
private final static int RADIUS = 120;
private final static int ANIMATION_TIME = 300;
private final static int TIME_INTERVAL = 30;
private Button Menu = null;
private Button Search = null;
private Button Mycollect = null;
private Button Sending = null;
private Button Mypaopao = null;
private Button Setting = null;
private List<Animation> outAnimations = new ArrayList<Animation>();
private List<Animation> inAnimations = new ArrayList<Animation>();
private List<Button> buttons = new ArrayList<Button>();
private boolean menuIsOpen = false;



private Camera camera;
private WindowManager wm;
private Display display;

private SurfaceHolder holder = null;

private SurfaceView loSurfaceView=null;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Menu = (Button) findViewById(R.id.menu);
Search = (Button) findViewById(R.id.search);
Mycollect = (Button) findViewById(R.id.mycollect);
Sending = (Button) findViewById(R.id.sending);
Mypaopao = (Button) findViewById(R.id.mypaopao);
Setting = (Button) findViewById(R.id.setting);
Menu.setOnTouchListener(this);
buttons.add(Search);
buttons.add(Mycollect);
buttons.add(Sending);
buttons.add(Mypaopao);
buttons.add(Setting);
for (int i = 0; i < buttons.size(); i++)
{
buttons.get(i).setOnTouchListener(this);
}
initAnimation();
structure();
}

private void structure()
{
loSurfaceView=(SurfaceView)findViewById(R.id.lo);
wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
display = wm.getDefaultDisplay();
holder = loSurfaceView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.setKeepScreenOn(true);
holder.addCallback(this);

}
private void initAnimation()
{
int size = buttons.size();
for (int i = 0; i < size; i++)
{
final Button button = buttons.get(i);
int x = 0;
int y = 0;
double angle;
if (i == 0)
{
x = -RADIUS;
y = 0;
}
else if (i == size - 1)
{
x = RADIUS;
y = 0;
}
else
{
angle = (180 / (size - 1)) * i;
x = (int) (RADIUS * Math.cos(Math.toRadians(180 - angle)));
y = (int) (RADIUS * Math.sin(Math.toRadians(angle)));
}
System.out.println("i=" + i + " x=" + x + " y=" + y);
long time = ANIMATION_TIME + i * TIME_INTERVAL;
AnimationSet outSet = new AnimationSet(true);
TranslateAnimation outTranAni = new TranslateAnimation(0, x, 0, -y);
outTranAni.setDuration(time);
outSet.addAnimation(outTranAni);
outSet.setFillAfter(true);
outAnimations.add(outSet);
final AnimationSet outAfterSet = new AnimationSet(true);
TranslateAnimation outAfterTranAni = new TranslateAnimation(x, x * 8 / 9, -y, -y * 8 / 9);
outAfterTranAni.setDuration(time);
outAfterSet.addAnimation(outAfterTranAni);
outAfterSet.setFillAfter(true);
outSet.setAnimationListener(new AnimationListener()
{
@Override
public void onAnimationEnd(Animation animation)
{
button.startAnimation(outAfterSet);


}

@Override
public void onAnimationRepeat(Animation animation)
{
}

@Override
public void onAnimationStart(Animation animation)
{
}
});
TranslateAnimation inTranAni = new TranslateAnimation(x * 8 / 9, 0, -y * 8 / 9, 0);
inTranAni.setDuration(time);
AnimationSet inSet = new AnimationSet(true);
inSet.addAnimation(inTranAni);
inSet.setFillAfter(true);
inAnimations.add(inSet);
}
}

@Override
public boolean onTouch(View v, MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_UP)
{
if (v.getId() == R.id.menu)
{
System.out.println("menu");
((Button)v).startAnimation(AnimationUtils.loadAnimation(this, R.anim.welcome));
if (!menuIsOpen)
{
menuIsOpen = true;
startOutAnimation();
}
else
{
menuIsOpen = false;
startInAnimation();
}
}
else if (v.getId() == R.id.search)
{
System.out.println("search");
}
else if (v.getId() == R.id.mycollect)
{
System.out.println("mycollect");
}
else if (v.getId() == R.id.sending)
{
System.out.println("sending");
}
else if (v.getId() == R.id.mypaopao)
{
System.out.println("mypaopao");
}
else if (v.getId() == R.id.setting)
{
System.out.println("setting");
}
}
return false;
}

private void startInAnimation()
{
for (int i = 0; i < buttons.size(); i++)
{
Button button = buttons.get(i);
button.startAnimation(inAnimations.get(i));
}
}

private void startOutAnimation()
{
for (int i = 0; i < buttons.size(); i++)
{
Button button = buttons.get(i);
button.startAnimation(outAnimations.get(i));
}
}

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

}

public void surfaceCreated(SurfaceHolder holder)
{
try
{
camera = Camera.open();// 打开摄像头
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(display.getHeight(), display.getWidth());
parameters.setPreviewFrameRate(4);
parameters.set("jpeg-quality;", 90);
camera.setParameters(parameters);
camera.setDisplayOrientation(90);
camera.setPreviewDisplay(holder);
camera.startPreview();// 开始预览
}
catch (Exception e)
{
e.printStackTrace();
}

}

public void surfaceDestroyed(SurfaceHolder holder)
{
if (camera != null)
{
camera.stopPreview();
camera.release();
camera = null;
}
}
}



...全文
122 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧