需求
拍照底部弹窗选择器
效果
实现原理
自定义dialog 加底部弹出动画 加回调
step1
public class ChoosePicDialog implements View.OnClickListener {
Activity mActivity;
/**
* 下面都是弹出框选择图片的内容
*
*/
private Button btnPictureStorage;
private Button btnTakePhoto;
private Button btnCancel;
private OnChoseListener mOnChoseListener;
public interface OnChoseListener {
void onTakePhoto(); //去拍照
void onPicAlbum(); //去开启图库
}
public ChoosePicDialog(Activity activity,OnChoseListener onChoseListener) {
this.mActivity = activity;
this.mOnChoseListener = onChoseListener;
showDialog();
}
private Dialog mDialog; //更换头像弹出框
/*弹出框,选择头像*/
private void showDialog() {
View view = View.inflate(mActivity, R.layout.photo_choose_dialog, null);
btnPictureStorage = (Button) view.findViewById(R.id.btn_picture_storage);
btnTakePhoto = (Button) view.findViewById(R.id.btn_take_photo);
btnCancel = (Button) view.findViewById(R.id.btn_cancel);
/**设置点击事件*/
btnPictureStorage.setOnClickListener(this);
btnTakePhoto.setOnClickListener(this);
btnCancel.setOnClickListener(this);
mDialog = new Dialog(mActivity, R.style.transparentFrameWindowStyle);
mDialog.setContentView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
Window window = mDialog.getWindow();
// 设置显示动画
window.setWindowAnimations(R.style.main_menu_animstyle);
WindowManager.LayoutParams wl = window.getAttributes();
wl.x = 0;
wl.y = mActivity.getWindowManager().getDefaultDisplay().getHeight();
// 以下这两句是为了保证按钮可以水平满屏
wl.width = ViewGroup.LayoutParams.MATCH_PARENT;
wl.height = ViewGroup.LayoutParams.WRAP_CONTENT;
// 设置显示位置
mDialog.onWindowAttributesChanged(wl);
// 设置点击外围解散
mDialog.setCanceledOnTouchOutside(true);
mDialog.show();
}
/**
* dialog点击事件,开启 相机,图库,取消
*/
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_picture_storage://图库
mOnChoseListener.onPicAlbum();
mDialog.dismiss();
break;
case R.id.btn_take_photo: //拍照
mOnChoseListener.onTakePhoto();
mDialog.dismiss();
break;
case R.id.btn_cancel://取消
mDialog.dismiss();
break;
}
}
}
step2
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00000000"
android:gravity="bottom"
android:orientation="vertical"
android:padding="5dip" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/photo_gallery_selector"
android:paddingBottom="10dip"
android:paddingTop="10dip"
android:id="@+id/btn_picture_storage"
android:text="图库"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="0.5dip"
android:background="#DAD9DB" />
<Button
android:id="@+id/btn_take_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/photo_camera_selector"
android:paddingBottom="10dip"
android:paddingTop="10dip"
android:text="拍照"
android:textSize="16sp" />
<Button
android:id="@+id/btn_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:background="@drawable/photo_cancel_selector"
android:paddingBottom="10dip"
android:paddingTop="10dip"
android:text="取消"
android:textSize="16sp" />
</LinearLayout>
style
transparentFrameWindowStyle
<!--选择头像动画-->
<style name="transparentFrameWindowStyle" parent="android:style/Theme.Dialog">
<item name="android:windowBackground">@drawable/photo_choose_bg</item>
</style>
main_menu_animstyle
<style name="main_menu_animstyle">
<item name="android:windowEnterAnimation">@anim/photo_dialog_in_anim</item>
<item name="android:windowExitAnimation">@anim/photo_dialog_out_anim</item>
</style>
两个方向透明动画
photo_dialog_in_anim
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="500"
android:fromXDelta="0"
android:fromYDelta="1000"
android:toXDelta="0"
android:toYDelta="0" />
</set>
photo_dialog_out_anim
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="500"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="1000" />
</set>
step3
具体使用
new ChoosePicDialog(this, new ChoosePicDialog.OnChoseListener() {
@Override
public void onTakePhoto() { //去拍照
}
@Override
public void onPicAlbum() {//去打开相册
}
};