Android 는 아래쪽 팝 업 창 배경 이 점점 어 두 워 지 는 효 과 를 실현 합 니 다.

Android 개발 에 서 는 어떤 단 추 를 누 르 면 대화 상자 나 선택 상 자 를 팝 업 해 야 하 며,Dialog 나 PopupMenu,PopupWindow 를 통 해 이 루어 집 니 다.
여기 서 주로 두 가 지 를 소개 한다.PopupMenu,PopupWindow 의 실현 이다.먼저 두 개의 효과 그림 을 보 세 요.위 에 PopupMenu,아래 PopupWindow:
PopupMenu PopupWindow

1.PopupMenu 구현:
PopupMenu 는 버튼 근처에 팝 업 된 대화 상 자 를 구현 하 는 데 사용 되 는 간단 한 구현 입 니 다.
먼저 menu 파일 을 정의 합 니 다\res\menu\headmounu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools" tools:context="com.arbo.hero.LoginActivity">
 <item
 android:id="@+id/camera"
 android:title="  "
 android:orderInCategory="100"
 app:showAsAction="never" />
 <item
 android:id="@+id/gallery"
 android:title="      "
 android:orderInCategory="100"
 app:showAsAction="never" />
 <item
 android:id="@+id/cancel"
 android:title="  "
 android:orderInCategory="100"
 app:showAsAction="never" />

</menu>
PopupMenu 를 만 들 고 클릭 이벤트 추가:

private void showPopmenu(View view){
 popupMenu = new PopupMenu(this,view);
 popupMenu.getMenuInflater().inflate(R.menu.headmenu,popupMenu.getMenu());
 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
 @Override
 public boolean onMenuItemClick(MenuItem item) {
 switch(item.getItemId()){
  case R.id.camera:
  Toast.makeText(HeadPortrait.this,"Click camera",Toast.LENGTH_SHORT).show();
  break;
  case R.id.gallery:
  Toast.makeText(HeadPortrait.this,"Click gallery",Toast.LENGTH_SHORT).show();
  break;
  case R.id.cancel:
  Toast.makeText(HeadPortrait.this,"Click cancel",Toast.LENGTH_SHORT).show();
  break;
 }
 return false;
 }
 });
 popupMenu.show();
 }
MainActivity 는 간단 합 니 다.단 추 를 누 르 면 showPopmenu()방법 을 호출 하면 됩 니 다.

public class MainActivity extends Activity{
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 //main.xml           ,        
 setContentView(R.layout.main);
 Button button = (Button) findViewById(R.id.button);
 button.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 //            popupMenu
 showPopmenu(btnmenu);
 }
 }
 }
}
팝 업 메뉴 를 이용 해 버튼 근처에 선택 상 자 를 팝 업 합 니 다.
PopupMenu 의 장점:간단 함;메뉴 크기 에 따라 위치 에 적응 하여 단추 근처에 팝 업 하기;어떤 상황 에 적합 하 다.
단점:형식 이 단일 하고 효과 가 보통이다.
2.PopupWindow 실현:
이에 비해 PopupWindow 의 실현 은 복잡 하지만 사용자 정의 가 강해 서 임의의 인 터 페 이 스 를 PopupWindow 로 설정 할 수 있 습 니 다.
팝 업 창 레이아웃 먼저 보기 windowpopup.xml:

<?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:layout_marginLeft="@dimen/activity_horizontal_margin"
 android:layout_marginRight="@dimen/activity_horizontal_margin"
 android:background="#dadada"
 android:orientation="vertical">
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical">
 <Button
 android:id="@+id/camera"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="  "
 android:background="#f0f0f0"
 />
 <TextView
 android:layout_width="match_parent"
 android:layout_height="1dp"
 android:background="#2d2c2c"
 />
 <Button
 android:background="#f0f0f0"
 android:id="@+id/gallery"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="       "/>
 <TextView
 android:layout_width="match_parent"
 android:layout_height="1dp"
 android:background="#2d2c2c"
 />
 <Button
 android:background="#f0f0f0"
 android:id="@+id/savepicture"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="    "/>

 </LinearLayout>

 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginTop="10dp"
 android:orientation="vertical">

 <Button
 android:background="#f0f0f0"
 android:id="@+id/cancel"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="  "
 />
 </LinearLayout>
</LinearLayout>
레이아웃 효과 그림:
布局
popupWindow 를 만 들 고 클릭 이 벤트 를 추가 합 니 다:

void bottomwindow(View view) {
 if (popupWindow != null && popupWindow.isShowing()) {
 return;
 }
 LinearLayout layout = (LinearLayout) getLayoutInflater().inflate(R.layout.window_popup, null);
 popupWindow = new PopupWindow(layout,
 ViewGroup.LayoutParams.MATCH_PARENT,
 ViewGroup.LayoutParams.WRAP_CONTENT);
 //      ,   pop  
 popupWindow.setFocusable(true);
 popupWindow.setBackgroundDrawable(new BitmapDrawable());
 //    、     
 popupWindow.setAnimationStyle(R.style.Popupwindow);
 int[] location = new int[2];
 view.getLocationOnScreen(location);
 popupWindow.showAtLocation(view, Gravity.LEFT | Gravity.BOTTOM, 0, -location[1]);
 //        
 setButtonListeners(layout);
 //  pop      ,                
 popupWindow.setOnDismissListener(new poponDismissListener());
 backgroundAlpha(1f);
 }
이벤트 감청 함수 setButtonListeners():

private void setButtonListeners(LinearLayout layout) {
 Button camera = (Button) layout.findViewById(R.id.camera);
 Button gallery = (Button) layout.findViewById(R.id.gallery);
 Button savepicture = (Button) layout.findViewById(R.id.savepicture);
 Button cancel = (Button) layout.findViewById(R.id.cancel);

 camera.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 if (popupWindow != null && popupWindow.isShowing()) {
  //            xxx
  popupWindow.dismiss();
 }
 }
 });
 gallery.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 if (popupWindow != null && popupWindow.isShowing()) {
  //            xxx
  popupWindow.dismiss();
 }
 }
 });
 savepicture.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 if (popupWindow != null && popupWindow.isShowing()) {
  //            xxx
  popupWindow.dismiss();
 }
 }
 });
 cancel.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 if (popupWindow != null && popupWindow.isShowing()) {
  popupWindow.dismiss();
 }
 }
 });
 }
팝 업,회수 애니메이션:
res 폴 더 에 anim 디 렉 터 리 가 없 으 면 new C>Android resource directory 이름 으로 anim 을 추가 합 니 다.그리고 tranlate 파일 두 개 를 새로 만 듭 니 다:
팝 업 윈도우out.xml :

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
 android:interpolator="@android:anim/decelerate_interpolator"
 android:fromYDelta="100%" android:toYDelta="0"
 android:duration="300"/>
윈도우 회수back.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
 android:interpolator="@android:anim/accelerate_interpolator"
 android:fromYDelta="0" android:toYDelta="100%"
 android:duration="200"/>
그리고 style.xml 에 이 두 개의 애니메이션 을 추가 합 니 다.

<style name="Popupwindow">
 <item name="android:windowEnterAnimation">@anim/window_out</item>
 <item name="android:windowExitAnimation">@anim/window_back</item>
 </style>
아니면 위의 같은 MainActivity 입 니까?단 추 를 누 르 면 이벤트 처리 함 수 를 popupwindow 로 바 꾸 면 됩 니 다.

btnmenu.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 bottomwindow(btnmenu);
 }
 }
이 버튼 을 누 르 면 화면 밑 에서 window 창 을 꺼 내 는 효 과 를 얻 을 수 있 습 니 다.다음 과 같 습 니 다.

하단 팝 업
그러나 이러한 효 과 는 좋 지 않다.우 리 는 windows 를 팝 업 할 때 다른 배경 이 반투명 으로 변 하여 중점 을 두 드 러 지게 할 수 있 기 를 바란다.인터넷 의 방법 은 이 코드 를 통 해 배경의 투명 도 를 바 꾸 는 것 이다.

/**
 *             
 * @param bgAlpha
 */
 public void backgroundAlpha(float bgAlpha)
 {
 WindowManager.LayoutParams lp = getWindow().getAttributes();
 lp.alpha = bgAlpha; //0.0-1.0
 getWindow().setAttributes(lp); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
 }
그리고 팝 업 할 때 배경 을 반투명 으로 설정 합 니 다.
bottomwindow(btnmenu);
backgroundAlpha(0.5f);
돌아 올 때 설정:
backgroundAlpha(1f);
이것 은 확실히 효 과 를 실현 할 수 있 지만 클릭 할 때 갑자기 어 두 워 지고 밝 아 져 서 효과 가 좋 지 않 습 니 다!다음 과 같다.
变暗
나 는 팝 업 과정 에서 점점 어 두 워 졌 으 면 좋 겠 다.한꺼번에 어 두 워 지 는 것 이 아니 라 과정 이 있다.여기 서 지연 시간 과 Handler 를 이용 하여 배경의 투명 도 를 동적 으로 바 꿉 니 다.

//         ,       
 @Override
 public void onClick(View view) {
 bottomwindow(btnmenu);
 new Thread(new Runnable(){
  @Override
  public void run() {
  while(alpha>0.5f){
  try {
  //4                  
  Thread.sleep(4);
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  Message msg =mHandler.obtainMessage();
  msg.what = 1;
  //    0.01,    ,        
  alpha-=0.01f;
  msg.obj =alpha ;
  mHandler.sendMessage(msg);
  }
  }

 }).start();
 }
마찬가지 로 돌아 올 때 투명 도 를 되 돌려 줍 니 다.

/**
 *                       
 */
 class poponDismissListener implements PopupWindow.OnDismissListener{

 @Override
 public void onDismiss() {
 // TODO Auto-generated method stub
 new Thread(new Runnable(){
 @Override
 public void run() {
  //  while   alpha  <=        
  while(alpha<1f){
  try {
  Thread.sleep(4);
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  Log.d("HeadPortrait","alpha:"+alpha);
  Message msg =mHandler.obtainMessage();
  msg.what = 1;
  alpha+=0.01f;
  msg.obj =alpha ;
  mHandler.sendMessage(msg);
  }
 }

 }).start();
 }

 }
Handler 에서 배경 을 투명 하 게 바 꾸 는 방법 을 사용 하면 됩 니 다.

Handler mHandler = new Handler(){
 @Override
 public void handleMessage(Message msg) {
 switch (msg.what){
 case 1:
  backgroundAlpha((float)msg.obj);
  break;
 }
 }
 };
이렇게 수정 한 후에 효 과 는 다음 과 같다.
最终效果
이상 은 기본적으로 점점 어 두 워 지고 변수의 목적 을 달성 했다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기