关于popupwindow的两种实现方式

http://104zz.iteye.com/blog/1685389

 

 

android PopupWindow实现从底部弹出或滑出选择菜单或窗口

本实例弹出窗口主要是继承PopupWindow类来实现的弹出窗体,布局可以根据自己定义设计。弹出效果主要使用了translate和alpha样式实现,具体实习如下:

第一步:设计弹出窗口xml:

 

Xml代码  关于popupwindow的两种实现方式
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout   
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="wrap_content"  
  6.     android:gravity="center_horizontal"  
  7.     android:orientation="vertical"  
  8.   >  
  9.   
  10. <LinearLayout   
  11.     android:id="@+id/pop_layout"  
  12.     android:layout_width="fill_parent"  
  13.     android:layout_height="wrap_content"  
  14.     android:gravity="center_horizontal"  
  15.     android:orientation="vertical"  
  16.     android:layout_alignParentBottom="true"  
  17.      android:background="@drawable/btn_style_alert_dialog_background"  
  18.      >  
  19.   
  20.       
  21.     <Button  
  22.         android:id="@+id/btn_take_photo"  
  23.         android:layout_marginLeft="20dip"  
  24.         android:layout_marginRight="20dip"  
  25.         android:layout_marginTop="20dip"  
  26.         android:layout_width="fill_parent"  
  27.         android:layout_height="wrap_content"  
  28.         android:text="拍照"  
  29.         android:background="@drawable/btn_style_alert_dialog_button"  
  30.         android:textStyle="bold"  
  31.          />  
  32.   
  33.     <Button  
  34.         android:id="@+id/btn_pick_photo"  
  35.         android:layout_marginLeft="20dip"  
  36.         android:layout_marginRight="20dip"  
  37.         android:layout_marginTop="5dip"   
  38.          android:layout_width="fill_parent"  
  39.         android:layout_height="wrap_content"  
  40.         android:text="从相册选择"  
  41.          android:background="@drawable/btn_style_alert_dialog_button"  
  42.          android:textStyle="bold"  
  43.          />  
  44.   
  45.     <Button  
  46.         android:id="@+id/btn_cancel"  
  47.        android:layout_marginLeft="20dip"  
  48.        android:layout_marginRight="20dip"  
  49.        android:layout_marginTop="15dip"   
  50.        android:layout_marginBottom="15dip"  
  51.        android:layout_width="fill_parent"  
  52.        android:layout_height="wrap_content"  
  53.        android:text="取消"  
  54.        android:background="@drawable/btn_style_alert_dialog_cancel"  
  55.        android:textColor="#ffffff"  
  56.        android:textStyle="bold"  
  57.          
  58.         />  
  59. </LinearLayout>  
  60. </RelativeLayout>  

 第二步:创建SelectPicPopupWindow类继承PopupWindow:

 

Java代码  关于popupwindow的两种实现方式
  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.drawable.ColorDrawable;  
  4. import android.view.LayoutInflater;  
  5. import android.view.MotionEvent;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.view.View.OnTouchListener;  
  9. import android.view.ViewGroup.LayoutParams;  
  10. import android.widget.Button;  
  11. import android.widget.PopupWindow;  
  12.   
  13. public class SelectPicPopupWindow extends PopupWindow {  
  14.   
  15.   
  16.     private Button btn_take_photo, btn_pick_photo, btn_cancel;  
  17.     private View mMenuView;  
  18.   
  19.     public SelectPicPopupWindow(Activity context,OnClickListener itemsOnClick) {  
  20.         super(context);  
  21.         LayoutInflater inflater = (LayoutInflater) context  
  22.                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  23.         mMenuView = inflater.inflate(R.layout.alert_dialog, null);  
  24.         btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo);  
  25.         btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo);  
  26.         btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel);  
  27.         //取消按钮  
  28.         btn_cancel.setOnClickListener(new OnClickListener() {  
  29.   
  30.             public void onClick(View v) {  
  31.                 //销毁弹出框  
  32.                 dismiss();  
  33.             }  
  34.         });  
  35.         //设置按钮监听  
  36.         btn_pick_photo.setOnClickListener(itemsOnClick);  
  37.         btn_take_photo.setOnClickListener(itemsOnClick);  
  38.         //设置SelectPicPopupWindow的View  
  39.         this.setContentView(mMenuView);  
  40.         //设置SelectPicPopupWindow弹出窗体的宽  
  41.         this.setWidth(LayoutParams.FILL_PARENT);  
  42.         //设置SelectPicPopupWindow弹出窗体的高  
  43.         this.setHeight(LayoutParams.WRAP_CONTENT);  
  44.         //设置SelectPicPopupWindow弹出窗体可点击  
  45.         this.setFocusable(true);  
  46.         //设置SelectPicPopupWindow弹出窗体动画效果  
  47.         this.setAnimationStyle(R.style.AnimBottom);  
  48.         //实例化一个ColorDrawable颜色为半透明  
  49.         ColorDrawable dw = new ColorDrawable(0xb0000000);  
  50.         //设置SelectPicPopupWindow弹出窗体的背景  
  51.         this.setBackgroundDrawable(dw);  
  52.         //mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框  
  53.         mMenuView.setOnTouchListener(new OnTouchListener() {  
  54.               
  55.             public boolean onTouch(View v, MotionEvent event) {  
  56.                   
  57.                 int height = mMenuView.findViewById(R.id.pop_layout).getTop();  
  58.                 int y=(int) event.getY();  
  59.                 if(event.getAction()==MotionEvent.ACTION_UP){  
  60.                     if(y<height){  
  61.                         dismiss();  
  62.                     }  
  63.                 }                 
  64.                 return true;  
  65.             }  
  66.         });  
  67.   
  68.     }  
  69.   
  70. }  

 

第三步:编写MainActivity类实现测试:

 

Java代码  关于popupwindow的两种实现方式
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.Gravity;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.TextView;  
  7.   
  8. public class MainActivity extends Activity {  
  9.   
  10.     //自定义的弹出框类  
  11.     SelectPicPopupWindow menuWindow;  
  12.       
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.         TextView tv = (TextView) this.findViewById(R.id.text);  
  18.         //把文字控件添加监听,点击弹出自定义窗口  
  19.         tv.setOnClickListener(new OnClickListener() {             
  20.             public void onClick(View v) {  
  21.                 //实例化SelectPicPopupWindow  
  22.                 menuWindow = new SelectPicPopupWindow(MainActivity.this, itemsOnClick);  
  23.                 //显示窗口  
  24.                 menuWindow.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置  
  25.             }  
  26.         });  
  27.     }  
  28.       
  29.     //为弹出窗口实现监听类  
  30.     private OnClickListener  itemsOnClick = new OnClickListener(){  
  31.   
  32.         public void onClick(View v) {  
  33.             menuWindow.dismiss();  
  34.             switch (v.getId()) {  
  35.             case R.id.btn_take_photo:  
  36.                 break;  
  37.             case R.id.btn_pick_photo:                 
  38.                 break;  
  39.             default:  
  40.                 break;  
  41.             }  
  42.               
  43.                   
  44.         }  
  45.           
  46.     };  
  47.       
  48. }  

 

第四:运行效果如下:


关于popupwindow的两种实现方式

 


 

http://104zz.iteye.com/blog/1687662

android 比较靠谱的选择图片以及拍照,保存图片

 

在开发项目中用到这个功能,之前就按照学过的拍照和选择照片的功能,所以也没在意就写了上去,可是最后发现在有些机子里面获取到的数据时空的,所以会导致程序崩溃的情况出现,网上找了很多例子大多都是一样的,还是有问题,后来就查看跟踪了拍照后返回的数据写了下面的代码相对大多数机子是可行的,经测试还是比较靠谱的,包括拍照后图片翻转了90度问题都没问题。直接看代码:

第一:拍照选择界面:

 

Java代码  关于popupwindow的两种实现方式
  1. import android.app.Activity;  
  2. import android.content.ActivityNotFoundException;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.provider.MediaStore;  
  6. import android.view.MotionEvent;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.LinearLayout;  
  11. import android.widget.Toast;  
  12.   
  13. public class SelectPicPopupWindow extends Activity implements OnClickListener {  
  14.   
  15.     private Button btn_take_photo, btn_pick_photo, btn_cancel;  
  16.     private LinearLayout layout;  
  17.     private Intent intent;  
  18.   
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.alert_dialog);  
  23.         intent = getIntent();  
  24.         btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);  
  25.         btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);  
  26.         btn_cancel = (Button) this.findViewById(R.id.btn_cancel);  
  27.   
  28.         layout = (LinearLayout) findViewById(R.id.pop_layout);  
  29.   
  30.         // 添加选择窗口范围监听可以优先获取触点,即不再执行onTouchEvent()函数,点击其他地方时执行onTouchEvent()函数销毁Activity  
  31.         layout.setOnClickListener(new OnClickListener() {  
  32.   
  33.             public void onClick(View v) {  
  34.                 // TODO Auto-generated method stub  
  35.                 Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",  
  36.                         Toast.LENGTH_SHORT).show();  
  37.             }  
  38.         });  
  39.         // 添加按钮监听  
  40.         btn_cancel.setOnClickListener(this);  
  41.         btn_pick_photo.setOnClickListener(this);  
  42.         btn_take_photo.setOnClickListener(this);  
  43.     }  
  44.   
  45.     // 实现onTouchEvent触屏函数但点击屏幕时销毁本Activity  
  46.     @Override  
  47.     public boolean onTouchEvent(MotionEvent event) {  
  48.         finish();  
  49.         return true;  
  50.     }  
  51.   
  52.     @Override  
  53.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  54.         if (resultCode != RESULT_OK) {  
  55.             return;  
  56.         }  
  57.         //选择完或者拍完照后会在这里处理,然后我们继续使用setResult返回Intent以便可以传递数据和调用  
  58.         if (data.getExtras() != null)  
  59.             intent.putExtras(data.getExtras());  
  60.         if (data.getData()!= null)  
  61.             intent.setData(data.getData());  
  62.         setResult(1, intent);  
  63.         finish();  
  64.   
  65.     }  
  66.   
  67.     public void onClick(View v) {  
  68.         switch (v.getId()) {  
  69.         case R.id.btn_take_photo:  
  70.             try {  
  71.                 //拍照我们用Action为MediaStore.ACTION_IMAGE_CAPTURE,  
  72.                 //有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个  
  73.                 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  74.                 intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);  
  75.                 startActivityForResult(intent, 1);  
  76.             } catch (Exception e) {  
  77.                 e.printStackTrace();  
  78.             }  
  79.             break;  
  80.         case R.id.btn_pick_photo:  
  81.             try {  
  82.                 //选择照片的时候也一样,我们用Action为Intent.ACTION_GET_CONTENT,  
  83.                 //有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个  
  84.                 Intent intent = new Intent();  
  85.                 intent.setType("image/*");  
  86.                 intent.setAction(Intent.ACTION_GET_CONTENT);  
  87.                 startActivityForResult(intent, 2);  
  88.             } catch (ActivityNotFoundException e) {  
  89.   
  90.             }  
  91.             break;  
  92.         case R.id.btn_cancel:  
  93.             finish();  
  94.             break;  
  95.         default:  
  96.             break;  
  97.         }  
  98.   
  99.     }  
  100.   
  101. }  

   

 

第二:显示照片界面:

 

Java代码  关于popupwindow的两种实现方式
  1. import android.app.Activity;  
  2. import android.content.Intent;  
  3. import android.graphics.Bitmap;  
  4. import android.net.Uri;  
  5. import android.os.Bundle;  
  6. import android.provider.MediaStore;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.ImageView;  
  10.   
  11. public class MainActivity extends Activity {  
  12.     private ImageView photo;  
  13.   
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.activity_main);  
  18.         photo = (ImageView) this.findViewById(R.id.text);  
  19.         // 把文字控件添加监听,点击弹出自定义窗口  
  20.         photo.setOnClickListener(new OnClickListener() {  
  21.             public void onClick(View v) {  
  22.                 //使用startActivityForResult启动SelectPicPopupWindow当返回到此Activity的时候就会调用onActivityResult函数  
  23.                 startActivityForResult(new Intent(MainActivity.this,  
  24.                         SelectPicPopupWindow.class), 1);  
  25.             }  
  26.         });  
  27.     }  
  28.   
  29.     @Override  
  30.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  31.   
  32.         switch (resultCode) {  
  33.         case 1:  
  34.             if (data != null) {  
  35.                 //取得返回的Uri,基本上选择照片的时候返回的是以Uri形式,但是在拍照中有得机子呢Uri是空的,所以要特别注意  
  36.                 Uri mImageCaptureUri = data.getData();  
  37.                 //返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取  
  38.                 if (mImageCaptureUri != null) {  
  39.                     Bitmap image;  
  40.                     try {  
  41.                         //这个方法是根据Uri获取Bitmap图片的静态方法  
  42.                         image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mImageCaptureUri);  
  43.                         if (image != null) {  
  44.                             photo.setImageBitmap(image);  
  45.                         }  
  46.                     } catch (Exception e) {  
  47.                         e.printStackTrace();  
  48.                     }  
  49.                 } else {  
  50.                     Bundle extras = data.getExtras();  
  51.                     if (extras != null) {  
  52.                         //这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片  
  53.                         Bitmap image = extras.getParcelable("data");  
  54.                         if (image != null) {  
  55.                             photo.setImageBitmap(image);  
  56.                         }  
  57.                     }  
  58.                 }  
  59.   
  60.             }  
  61.             break;  
  62.         default:  
  63.             break;  
  64.   
  65.         }  
  66.     }  
  67.   
  68. }  

 

 

第三:如果需要保存图片到SD卡或者上传图片可以用下面代码:

 

Java代码  关于popupwindow的两种实现方式
  1. public static String savePicToSdcard(Bitmap bitmap, String path,  
  2.             String fileName) {  
  3.         String filePath = "";  
  4.         if (bitmap == null) {  
  5.             return filePath;  
  6.         } else {  
  7.   
  8.             filePath=path+ fileName;  
  9.             File destFile = new File(filePath);  
  10.             OutputStream os = null;  
  11.             try {  
  12.                 os = new FileOutputStream(destFile);  
  13.                 bitmap.compress(CompressFormat.JPEG, 100, os);  
  14.                 os.flush();  
  15.                 os.close();  
  16.             } catch (IOException e) {  
  17.                 filePath = "";  
  18.             }  
  19.         }  
  20.         return filePath;  
  21.     }  

   

上传图片的话我们可以获取bitmap的流然后上传,如上面方式获取,如要上传,上传代码自己实现,这个比较简单。

运行效果图:


关于popupwindow的两种实现方式

关于popupwindow的两种实现方式,布布扣,bubuko.com

关于popupwindow的两种实现方式

上一篇:微软职位内部推荐-Senior SDE for Win Shell Exp


下一篇:setAnimationStyle实现的popwindow显示消失的动画效果