Android仿新浪微博發(fā)送菜單界面的實現(xiàn)
效果圖
接下來就是一波貼代碼的過程
自定義Dialog
public 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); } } /** * 設(shè)置模糊背景 */ 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:id="@+id/iv_dialog_sina_bg" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY" /> <ImageButton android:id="@+id/ib_dialog_sina_close" android:layout_width="15dp" android:layout_height="15dp" android:src="@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:id="@+id/ll_dialog_sina_menu" 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:id="@+id/ll_dialog_sina_write" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center_horizontal" > <ImageView android:layout_width="75dp" android:layout_height="75dp" android:src="@drawable/dialog_sina_send_write" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="13sp" android:textColor="@color/text_gray" android:text="一般內(nèi)容" android:layout_marginTop="8dp" /> </LinearLayout> <LinearLayout android:id="@+id/ll_dialog_sina_time" 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" > <ImageView android:layout_width="75dp" android:layout_height="75dp" android:src="@drawable/dialog_sina_send_time" /> <TextView android: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:id="@+id/ll_dialog_sina_map" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center_horizontal" > <ImageView android:layout_width="75dp" android:layout_height="75dp" android:src="@drawable/dialog_sina_send_map" /> <TextView android: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:id="@+id/iv_dialog_sina_des" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@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; } /** * 截取當(dāng)前屏幕 * @param activity * @return */ public Bitmap getScreenShot(Activity activity) { // 獲取windows中最頂層的view View view = activity.getWindow().getDecorView(); view.buildDrawingCache(); // 獲取狀態(tài)欄高度 Rect rect = new Rect(); view.getWindowVisibleDisplayFrame(rect); int statusBarHeights = rect.top; Display display = activity.getWindowManager().getDefaultDisplay(); // 獲取屏幕寬和高 int widths = display.getWidth(); int heights = display.getHeight(); // 允許當(dāng)前窗口保存緩存信息 view.setDrawingCacheEnabled(true); // 去掉狀態(tài)欄 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(); }
基本講一下邏輯,背景采用截屏高斯模糊處理,這里一定要降圖片質(zhì)量,不然會慢,按鈕采用一個動畫從上向下劃出,雖然不是特別完美,但是多少有個樣子。
源碼地址:
https://github.com/bertsir/SinaSendView
到這里就結(jié)束啦.
以上就是Android仿新浪微博發(fā)送菜單界面的實現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Android 發(fā)送菜單界面的實現(xiàn)的資料請關(guān)注腳本之家其它相關(guān)文章!
- Android實現(xiàn)微博菜單彈出效果
- Android 側(cè)滑抽屜菜單的實現(xiàn)代碼
- Android實現(xiàn)動畫效果的自定義下拉菜單功能
- Android實現(xiàn)上下菜單雙向滑動
- Android如何實現(xiàn)底部菜單固定到底部
- Android實現(xiàn)微信加號菜單模式
- Android實現(xiàn)衛(wèi)星菜單效果
- Android自定義轉(zhuǎn)盤菜單效果
- Android底部菜單欄(RadioGroup+Fragment)美化
- Android recyclerView橫條指示器實現(xiàn)淘寶菜單模塊
- android studio 的下拉菜單Spinner使用詳解
相關(guān)文章
Android 出現(xiàn)問題Installation error: INSTALL_FAILED_CONFLICTING_P
這篇文章主要介紹了Android 出現(xiàn)問題Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12Android實現(xiàn)Unity3D下RTMP推送的示例
像Unity3D下的RTMP或RTSP播放器一樣,好多開發(fā)者苦于在Unity環(huán)境下,如何高效率低延遲的把數(shù)據(jù)采集并編碼實時推送到流媒體服務(wù)器,實現(xiàn)Unity場景下的低延遲推拉流方案。本文介紹幾種RTMP推送的方案2021-06-06基于Android引入IjkPlayer無法播放mkv格式視頻的解決方法
下面小編就為大家分享一篇基于Android引入IjkPlayer無法播放mkv格式視頻的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android仿淘寶詳情頁面viewPager滑動到最后一張圖片跳轉(zhuǎn)的功能
需要做一個仿淘寶客戶端ViewPager滑動到最后一頁,再拖動的時候跳到詳情的功能,剛開始我也迷糊了,通過查閱相關(guān)資料發(fā)現(xiàn)有好多種實現(xiàn)方法,下面小編給大家分享實例代碼,感興趣的朋友一起看看吧2017-03-03Android RecycleView和線型布局制作聊天布局
大家好,本篇文章主要講的是Android RecycleView和線型布局制作聊天布局,感興趣的同學(xué)趕緊來看一看吧,對你有幫助的話記得收藏一下2022-01-01Android 新聞界面模擬ListView和ViewPager的應(yīng)用
本文主要介紹 Android ListView和ViewPager的應(yīng)用,這里模擬了新聞界面及實現(xiàn)示例代碼,有需要的小伙伴可以參考下2016-09-09Android編程之界面實現(xiàn)全屏顯示的方法(2種方法)
這篇文章主要介紹了Android編程之界面實現(xiàn)全屏顯示的方法,結(jié)合實例分析了Java代碼中設(shè)置與Manifest文件設(shè)置2種實現(xiàn)方法,需要的朋友可以參考下2016-01-01