Android 사용자 정의 PopWindow QQ,위 챗 팝 업 메뉴 효과 구현

얼마 전에 개인 이 개발 한 프로젝트 에서 팝 업 메뉴 를 사용 해 야 했 습 니 다.QQ 오른쪽 상단 의 팝 업 메뉴 와 같이 자신 이 popwin 을 사용 하 는 횟수 도 많 지 않 았 습 니 다.그 중에서 도 약간의 문제 가 있 었 습 니 다.오늘 마침 시간 이 나 면 경험 을 공유 하 겠 습 니 다.
최종 적 으로 이 루어 진 후의 효과 가 어떤 지 먼저 살 펴 보고 아래 에 그림 을 올 립 니 다.

사용자 정의 팝 업 메뉴 는 계 승 된 popwin 입 니 다.view 가 바퀴 를 반복 할 필요 가 없 기 때 문 이 아 닙 니 다.특별한 효 과 를 얻 으 려 면 따로 말 합 니 다.우선 클래스 MyPopWindow 를 만들어 Popwindow 를 계승 합 니 다.

public class MyPopWindow extends PopupWindow implements View.OnClickListener {
 private Context context;
 private View view;
 private LinearLayout scan;
 private LinearLayout add;
 public MyPopWindow(Context context) {
 this(context, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
 }

 public MyPopWindow(Context context, int width, int height) {
 super(context);
 this.context = context;
 setWidth(width);
 setHeight(height);
 setFocusable(true);
 setOutsideTouchable(true);
 setTouchable(true);
 view = LayoutInflater.from(context).inflate(R.layout.layout_mypopwin,null);
 setContentView(view);
 scan = (LinearLayout) view.findViewById(R.id.scan);
 add = (LinearLayout) view.findViewById(R.id.add);
 }

 @Override
 public void onClick(View view) {
 switch (view.getId()){
  case R.id.scan:

  break;
  case R.id.add:

  break;
 }
 }
}

다음은 최초의 레이아웃 파일 을 드 리 겠 습 니 다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="match_parent"
 android:layout_height="match_parent">
 <LinearLayout
 android:id="@+id/scan"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content">
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="   "
  android:textSize="16sp"/>
 </LinearLayout>
 <View
 android:layout_width="wrap_content"
 android:layout_height="0.5dp"
 android:background="#cdcdcd"/>
 <LinearLayout
 android:id="@+id/add"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content">
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="   "
  android:textSize="16sp"/>
 </LinearLayout>
</LinearLayout>
activity 에서 사용자 정의 팝 업 메뉴 를 호출 하여 현재 효 과 를 봅 니 다.

호출 된 코드 MyPopWindow win=new MyPopWindow(MainActivity.this,200,150);팝 업 메뉴 의 너비 와 높이 를 지정 하 였 습 니 다.주지 않 으 면 기본적으로 wrap 을 드 립 니 다.content,전체 화면의 너비 가 묻 습 니 다.이 모양 은 여전히 비교적 누추 하 다.현재 레이아웃 파일 에 9 그림 의 배경 그림 을 더 해서 효 과 를 보고 있다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@drawable/title_function_bg">
 <LinearLayout
 android:id="@+id/scan"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content">
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="   "
  android:textSize="16sp"/>
 </LinearLayout>
 <View
 android:layout_width="wrap_content"
 android:layout_height="0.5dp"
 android:background="#cdcdcd"/>
 <LinearLayout
 android:id="@+id/add"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content">
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="   "
  android:textSize="16sp"/>
 </LinearLayout>
</LinearLayout>
실행 후 효과

좀 아름 답지 만 배경 뒤에 또 어떤 상황 이 있 습 니까?그러면 문제 가 생 겼 습 니 다.이 문 제 를 어떻게 해결 합 니까?그러면 popwin 의 구조 방법 에 setBackground Drawable(new BitmapDrawable()을 추가 하면 못 생 긴 사각형 배경 이 사라 집 니 다.

목표 효과 에 가 까 워 졌 습 니 다.현재 문 제 는 메뉴 항목 을 추가 할 때마다 수 동 으로 너비 와 높이 를 맞 추 는 것 이 귀 찮 습 니 다.높이,너비 에 적응 하려 면 레이아웃 파일 을 수정 해 야 합 니 다.안 드 로 이 드 가 item 의 컨트롤 을 자 유 롭 게 증가 시 킬 수 있다 는 것 을 생각해 보 세 요.먼저 떠 오 르 는 것 은 listview 입 니 다.레이아웃 파일 수정

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="@drawable/title_function_bg">
 <ListView
 android:id="@+id/title_list"
 android:layout_width="120dp"
 android:layout_height="fill_parent"
 android:cacheColorHint="#00000000"
 android:divider="@drawable/popu_line"
 android:padding="3dp"
 android:scrollingCache="false"
 android:listSelector="@drawable/title_list_selector"/>
</LinearLayout>

그리고 사용자 정의 popwindow 를 수정 합 니 다.

public class CustomWin extends PopupWindow {
 private Context context;
 private View view;
 private ListView listView;
 private List<String> list;

 public CustomWin(Context context) {
 this(context, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
 }

 public CustomWin(Context context, int with, int height) {
 this.context = context;
 setWidth(with);
 setHeight(height);
 //        
 setFocusable(true);
 //        
 setTouchable(true);
 //        
 setOutsideTouchable(true);
 setBackgroundDrawable(new BitmapDrawable());
 view = LayoutInflater.from(context).inflate(R.layout.popwin_menu,null);
 setContentView(view);
 setAnimationStyle(R.style.popwin_anim_style);
 initData();
 }

 private void initData() {
 listView = (ListView) view.findViewById(R.id.title_list);
 list = new ArrayList<String>();
 list.add("    ");
 list.add("   ");
 list.add("   ");
 list.add("    ");
 //        
 listView.setAdapter(new BaseAdapter() {
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 TextView textView = null;

 if (convertView == null) {
  textView = new TextView(context);
  textView.setTextColor(Color.rgb(255,255,255));
  textView.setTextSize(14);
  //      
  textView.setGravity(Gravity.CENTER);
  //        
  textView.setPadding(0, 13, 0, 13);
  //          (   )
  textView.setSingleLine(true);
 } else {
  textView = (TextView) convertView;
 }
 //      
 textView.setText(list.get(position));
 //          
 textView.setCompoundDrawablePadding(0);
 //             
 textView.setCompoundDrawablesWithIntrinsicBounds(R.mipmap., null, null, null);

 return textView;
 }

 @Override
 public long getItemId(int position) {
 return position;
 }

 @Override
 public Object getItem(int position) {
 return list.get(position);
 }

 @Override
 public int getCount() {
 return list.size();
 }
 });
 }
}
최종 효과:

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기