Android 는 아래쪽 팝 업 창 배경 이 점점 어 두 워 지 는 효 과 를 실현 합 니 다.
12683 단어 AndroidPopupWindow어 두 워 지다
여기 서 주로 두 가 지 를 소개 한다.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;
}
}
};
이렇게 수정 한 후에 효 과 는 다음 과 같다.이상 은 기본적으로 점점 어 두 워 지고 변수의 목적 을 달성 했다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.