Android仿新浪微博發送菜單界面的實現
接下來就是一波貼代碼的過程
自定義Dialogpublic class SinaSendView extends Dialog { private ImageButton ib_dialog_sina_close; private LinearLayout ll_dialog_sina_write; private LinearLayout ll_dialog_sina_time; private LinearLayout ll_dialog_sina_map; private LinearLayout ll_dialog_sina_menu; private ImageView iv_dialog_sina_bg,iv_dialog_sina_des; private Context mContext; private Boolean hideDes; private Bitmap screenShot; private Bitmap bitmap; private ByteArrayOutputStream baos; private byte[] bytes; public SinaSendView(Context context) { super(context); this.mContext = context; } public SinaSendView(Context context, int themeResId,Boolean hideDes) { super(context, themeResId); this.mContext = context; this.hideDes = hideDes; } protected SinaSendView(Context context, boolean cancelable, OnCancelListener cancelListener) { super(context, cancelable, cancelListener); this.mContext = context; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.layout_sina_send_dialog); ib_dialog_sina_close = (ImageButton) findViewById(R.id.ib_dialog_sina_close); ll_dialog_sina_write = (LinearLayout) findViewById(R.id.ll_dialog_sina_write); ll_dialog_sina_time = (LinearLayout) findViewById(R.id.ll_dialog_sina_time); ll_dialog_sina_map = (LinearLayout) findViewById(R.id.ll_dialog_sina_map); ll_dialog_sina_menu = (LinearLayout) findViewById(R.id.ll_dialog_sina_menu); iv_dialog_sina_bg = (ImageView) findViewById(R.id.iv_dialog_sina_bg); iv_dialog_sina_des = (ImageView) findViewById(R.id.iv_dialog_sina_des); initView(); } private void initView() { setBrulBg(); ll_dialog_sina_menu.setVisibility(View.VISIBLE); ll_dialog_sina_menu.setAnimation(AnimationUtil.moveToViewLocationFromTop()); ib_dialog_sina_close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {ll_dialog_sina_menu.setAnimation(AnimationUtil.moveToViewBottom());ll_dialog_sina_menu.setVisibility(View.GONE);dismiss(); } }); if(hideDes){ iv_dialog_sina_des.setVisibility(View.GONE); } } /** * 設置模糊背景 */ private void setBrulBg(){ screenShot = CommonUtils.getInstance().getScreenShot((Activity) mContext); bitmap = CommonUtils.getInstance().zoomImg(screenShot, 0.2f); baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 1, baos); bytes = baos.toByteArray(); Glide.with(mContext).load(bytes).asBitmap().transform(new BlurTransformation(CommonUtils.getInstance().getContext(), 25)).into(iv_dialog_sina_bg); } public void setClick(final SinaSendDialog mSinaSendDialog){ this.show(); ll_dialog_sina_write.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {mSinaSendDialog.onNormalClick();dismiss(); } }); ll_dialog_sina_map.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {mSinaSendDialog.onMapClick();dismiss(); } }); ll_dialog_sina_time.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {mSinaSendDialog.onTimeClick();dismiss(); } }); } @Override public void dismiss() { super.dismiss(); if(screenShot != null && !screenShot.isRecycled()){ screenShot.recycle(); screenShot = null; } if(bitmap != null && !bitmap.isRecycled()){ bitmap.recycle(); bitmap = null; } try { baos.close(); } catch (IOException e) { e.printStackTrace(); } bytes = null; System.gc(); }}布局文件
<?xml version='1.0' encoding='utf-8'?><FrameLayout xmlns:android='http://schemas.android.com/apk/res/android' android:layout_width='match_parent' android:layout_height='match_parent' > <ImageView android: android:layout_width='match_parent' android:layout_height='match_parent' android:scaleType='fitXY' /> <ImageButton android: android:layout_width='15dp' android:layout_height='15dp' android:src='http://www.aoyou183.cn/bcjs/@drawable/dialog_sina_send_close' android:background='@null' android:layout_gravity='bottom|center_horizontal' android:layout_marginBottom='17dp' /> <ImageView android:layout_width='match_parent' android:layout_height='0.5dp' android:background='@color/line_gray' android:layout_gravity='bottom' android:layout_marginBottom='50dp' /> <LinearLayout android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_gravity='bottom|center_horizontal' android:layout_marginBottom='120dp' android:orientation='horizontal' android:visibility='gone' > <LinearLayout android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:orientation='vertical' android:gravity='center_horizontal' > <ImageViewandroid:layout_width='75dp'android:layout_height='75dp'android:src='http://www.aoyou183.cn/bcjs/@drawable/dialog_sina_send_write'/> <TextViewandroid:layout_width='wrap_content'android:layout_height='wrap_content'android:textSize='13sp'android:textColor='@color/text_gray'android:text='一般內容'android:layout_marginTop='8dp'/> </LinearLayout> <LinearLayout android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:orientation='vertical' android:gravity='center_horizontal' android:layout_marginLeft='35dp' android:layout_marginRight='35dp' > <ImageViewandroid:layout_width='75dp'android:layout_height='75dp'android:src='http://www.aoyou183.cn/bcjs/@drawable/dialog_sina_send_time'/> <TextViewandroid:layout_width='wrap_content'android:layout_height='wrap_content'android:textSize='13sp'android:textColor='@color/text_gray'android:text='時間膠囊'android:layout_marginTop='8dp'/> </LinearLayout> <LinearLayout android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:orientation='vertical' android:gravity='center_horizontal' > <ImageViewandroid:layout_width='75dp'android:layout_height='75dp'android:src='http://www.aoyou183.cn/bcjs/@drawable/dialog_sina_send_map'/> <TextViewandroid:layout_width='wrap_content'android:layout_height='wrap_content'android:textSize='13sp'android:textColor='@color/text_gray'android:text='地點膠囊'android:layout_marginTop='8dp'/> </LinearLayout> </LinearLayout> <ImageView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:src='http://www.aoyou183.cn/bcjs/@drawable/dialog_sina_send_des' android:layout_gravity='center_horizontal' android:layout_marginTop='70dp' /></FrameLayout>Style
<style name='SinaSendDialog'> <item name='android:windowFullscreen'>true</item> <item name='android:windowNoTitle'>true</item> <item name='android:windowBackground'>@android:color/transparent</item></style>工具方法
/** * 從控件的頂部移動到控件所在位置 * * @return */ public static TranslateAnimation moveToViewLocationFromTop() { TranslateAnimation mHiddenAction = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,-1.0f, Animation.RELATIVE_TO_SELF, 0.0f); mHiddenAction.setDuration(500); return mHiddenAction; } /** * 截取當前屏幕 * @param activity * @return */ public Bitmap getScreenShot(Activity activity) { // 獲取windows中最頂層的view View view = activity.getWindow().getDecorView(); view.buildDrawingCache(); // 獲取狀態欄高度 Rect rect = new Rect(); view.getWindowVisibleDisplayFrame(rect); int statusBarHeights = rect.top; Display display = activity.getWindowManager().getDefaultDisplay(); // 獲取屏幕寬和高 int widths = display.getWidth(); int heights = display.getHeight(); // 允許當前窗口保存緩存信息 view.setDrawingCacheEnabled(true); // 去掉狀態欄 Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0,0, widths, heights); // 銷毀緩存信息 view.destroyDrawingCache(); return bmp; } /** * 改變bitmap寬高 * @param bm * @param f * @return */ public Bitmap zoomImg(Bitmap bm,float f){ int width = bm.getWidth(); int height = bm.getHeight(); float scaleWidth = f; float scaleHeight = f; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true); return newbm; }接口
public interface SinaSendDialog { void onNormalClick(); void onTimeClick(); void onMapClick();}
基本講一下邏輯,背景采用截屏高斯模糊處理,這里一定要降圖片質量,不然會慢,按鈕采用一個動畫從上向下劃出,雖然不是特別完美,但是多少有個樣子。
源碼地址:
https://github.com/bertsir/SinaSendView
到這里就結束啦.
以上就是Android仿新浪微博發送菜單界面的實現的詳細內容,更多關于Android 發送菜單界面的實現的資料請關注好吧啦網其它相關文章!
相關文章: