自定義PopupWindow彈出框(帶有動畫)和呼叫相簿相機佈局
阿新 • • 發佈:2019-02-01
使用PopupWindow來實現彈出框,並且帶有動畫效果
效果一:(第二張圖)首先自定義PopupWindow
public class LostPopupWindow extends PopupWindow { public Lost lost; public void onLost(Lost lost){ this.lost = lost; } private View conentView; public View getConentView() { return conentView; } public LostPopupWindow(final Activity context) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); conentView = inflater.inflate(R.layout.lost_pop_menu, null); int h = context.getWindowManager().getDefaultDisplay().getHeight(); int w = context.getWindowManager().getDefaultDisplay().getWidth(); // 設定SelectPicPopupWindow的View this.setContentView(conentView); // 設定SelectPicPopupWindow彈出窗體的寬 this.setWidth(w / 2 + 50); // 設定SelectPicPopupWindow彈出窗體的高 this.setHeight(LayoutParams.WRAP_CONTENT); // 設定SelectPicPopupWindow彈出窗體可點選 this.setFocusable(true); this.setOutsideTouchable(true); // 重新整理狀態 this.update(); // 例項化一個ColorDrawable顏色為半透明 ColorDrawable dw = new ColorDrawable(0000000000); // 點back鍵和其他地方使其消失,設定了這個才能觸發OnDismisslistener ,設定其他控制元件變化等操作 this.setBackgroundDrawable(dw); // mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog); // 設定SelectPicPopupWindow彈出窗體動畫效果 this.setAnimationStyle(R.style.AnimationPreview); LinearLayout send = (LinearLayout) conentView .findViewById(R.id.send); LinearLayout mySend = (LinearLayout) conentView .findViewById(R.id.my_send); LinearLayout all = (LinearLayout) conentView.findViewById(R.id.all); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { LostPopupWindow.this.dismiss(); lost.onLost(2); } }); mySend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LostPopupWindow.this.dismiss(); lost.onLost(1); } }); all.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LostPopupWindow.this.dismiss(); lost.onLost(0); } }); } /** * 顯示popupWindow * * @param parent */ public void showPopupWindow(View parent) { if (!this.isShowing()) { // 以下拉方式顯示popupwindow this.showAsDropDown(parent, parent.getLayoutParams().width / 2, 18); } else { this.dismiss(); } } }
R.layout.lost_pop_menu檔案
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:background="@drawable/black_menu_pop_bg" android:orientation="vertical" android:paddingLeft="@dimen/activity_horizontal_margin"> <LinearLayout android:id="@+id/send" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center_vertical" android:orientation="horizontal" android:scaleType="fitXY"> <ImageView android:id="@+id/img5" android:layout_width="20dp" android:layout_height="20dp" android:src="@drawable/icon_lost_add" /> <TextView android:id="@+id/item_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="釋出資訊" android:textColor="#e5e5e6" android:textSize="18sp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1px" android:background="#616467" /> <LinearLayout android:id="@+id/my_send" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:id="@+id/img6" android:layout_width="20dp" android:layout_height="20dp" android:scaleType="fitXY" android:src="@drawable/icon_lost_my" /> <TextView android:id="@+id/item_content1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="我釋出的資訊" android:textColor="#e5e5e6" android:textSize="18sp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1px" android:background="#616467" /> <LinearLayout android:id="@+id/all" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:id="@+id/img7" android:layout_width="20dp" android:layout_height="20dp" android:scaleType="fitXY" android:src="@drawable/icon_all" /> <TextView android:id="@+id/item_content2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="全部資訊" android:textColor="#e5e5e6" android:textSize="18sp" /> </LinearLayout> </LinearLayout>
動畫R.style.AnimationPreview
呼叫<style name="AnimationPreview"> <item name="android:windowEnterAnimation">@anim/fade_in</item> <item name="android:windowExitAnimation">@anim/fade_out</item> </style> @anim/fade_in <?xml version="1.0" encoding="utf-8"?> <!-- 左上角擴大--> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.001" android:toXScale="1.0" android:fromYScale="0.001" android:toYScale="1.0" android:pivotX="100%" android:pivotY="10%" android:duration="200" /> @anim/fade_out <!-- 左上角縮小 --> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="0.001" android:fromYScale="1.0" android:toYScale="0.001" android:pivotX="100%" android:pivotY="10%" android:duration="200" />
LostPopupWindow popWindow = new LostPopupWindow(ZiXunDetailActivity.this);
((ImageView)(popWindow.getConentView().findViewById(R.id.img5))).setImageResource(R.drawable.ckplico);
((ImageView)(popWindow.getConentView().findViewById(R.id.img6))).setImageResource(R.drawable.fbplico);
((ImageView)(popWindow.getConentView().findViewById(R.id.img7))).setImageResource(R.drawable.zfplico);
((TextView)(popWindow.getConentView().findViewById(R.id.item_content))).setText("檢視評論");
((TextView)(popWindow.getConentView().findViewById(R.id.item_content1))).setText("發表評論");
((TextView)(popWindow.getConentView().findViewById(R.id.item_content2))).setText("轉發文章");
popWindow.showPopupWindow(linMain);
popWindow.onLost(new Lost() {
@Override
public void onLost(int index) {
switch (index){
case 0: //轉發文章
break;
case 1: //發表評論
lineFooter.setVisibility(View.VISIBLE);
break;
case 2://檢視評論
Bundle bundle=new Bundle();
bundle.putString("id",mID);
startActivity(PingLunActivity.class, "熱門評論", bundle);
break;
}
}
});
效果二:(第一張圖)
1.工具類
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.PopupWindow;
import com.example.lgy.myviewpagerapplication.R;
public class SelectPicPopupWindow extends PopupWindow {
private Button btn_take_photo, btn_pick_photo, btn_cancel;
private View mMenuView;
public SelectPicPopupWindow(Activity context,OnClickListener itemsOnClick) {
super(context);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mMenuView = inflater.inflate(R.layout.alert_dialog, null);
btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo);
btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo);
btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel);
//取消按鈕
btn_cancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//銷燬彈出框
dismiss();
}
});
//設定按鈕監聽
btn_pick_photo.setOnClickListener(itemsOnClick);
btn_take_photo.setOnClickListener(itemsOnClick);
//設定SelectPicPopupWindow的View
this.setContentView(mMenuView);
//設定SelectPicPopupWindow彈出窗體的寬
this.setWidth(LayoutParams.FILL_PARENT);
//設定SelectPicPopupWindow彈出窗體的高
this.setHeight(LayoutParams.WRAP_CONTENT);
//設定SelectPicPopupWindow彈出窗體可點選
this.setFocusable(true);
//設定SelectPicPopupWindow彈出窗體動畫效果
this.setAnimationStyle(R.style.AnimationPreview);
//例項化一個ColorDrawable顏色為半透明
ColorDrawable dw = new ColorDrawable(0xb0000000);
//設定SelectPicPopupWindow彈出窗體的背景
this.setBackgroundDrawable(dw);
//mMenuView新增OnTouchListener監聽判斷獲取觸屏位置如果在選擇框外面則銷燬彈出框
mMenuView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int height = mMenuView.findViewById(R.id.pop_layout).getTop();
int y=(int) event.getY();
if(event.getAction()==MotionEvent.ACTION_UP){
if(y<height){
dismiss();
}
}
return true;
}
});
}
}
2.佈局,動畫就用上面的
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical"
>
<LinearLayout
android:id="@+id/pop_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical"
android:layout_alignParentBottom="true"
android:background="@drawable/bg_home_search"
>
<Button
android:id="@+id/btn_take_photo"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="20dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="拍照"
android:background="@drawable/bg_home_search"
android:textStyle="bold"
/>
<Button
android:id="@+id/btn_pick_photo"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="5dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="從相簿選擇"
android:background="@drawable/bg_home_search"
android:textStyle="bold"
/>
<Button
android:id="@+id/btn_cancel"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginTop="15dip"
android:layout_marginBottom="15dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="取消"
android:background="@drawable/bg_home_search"
android:textStyle="bold"
/>
</LinearLayout>
</RelativeLayout>
3.按鈕背景
<?xml version="1.0" encoding="utf-8"?>
<!--<shape xmlns:android="http://schemas.android.com/apk/res/android"-->
<!--android:shape="rectangle">-->
<!--<corners android:radius="5dp"/>-->
<!--<solid-->
<!--android:color="@color/ball_blue"/>-->
<!--</shape>-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="1dp"
android:color="#C2C0C0" />
<solid android:color="#FFFFFF" />
<padding
android:bottom="5dp"
android:left="5dp"
android:right="5dp"
android:top="5dp" />
<corners android:radius="5dp" />
</shape>
4.主函式程式碼
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity {
//自定義的彈出框類
SelectPicPopupWindow menuWindow;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) this.findViewById(R.id.text);
//把文字控制元件新增監聽,點選彈出自定義視窗
tv.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//例項化SelectPicPopupWindow
menuWindow = new SelectPicPopupWindow(MainActivity.this, itemsOnClick);
//顯示視窗
menuWindow.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //設定layout在PopupWindow中顯示的位置
}
});
}
//為彈出視窗實現監聽類
private OnClickListener itemsOnClick = new OnClickListener(){
public void onClick(View v) {
menuWindow.dismiss();
switch (v.getId()) {
case R.id.btn_take_photo:
break;
case R.id.btn_pick_photo:
break;
default:
break;
}
}
};
}