Android仿新浪微博发送菜单界面的实现

效果图

接下来就是一波贴代码的过程

自定义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);
    }
  }

  /**
   * 设置模糊背景
   */
  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="一般内容"
        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;
  }

  /**
   * 截取当前屏幕
   * @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 发送菜单界面的实现的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android实现卫星菜单效果

    前言 最近需求中,需要实现 卫星菜单的需求,最终通过自定义View和动画属性来实现,具体功能如下: 1.自定义View import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animat

  • Android实现动画效果的自定义下拉菜单功能

    我们在购物APP里面设置收货地址时,都会有让我们选择省份及城市的下拉菜单项.今天我将使用Android原生的 Spinner 控件来实现一个自定义的下拉菜单功能,并配上一个透明渐变动画效果. 要实现的功能及思路如下: 下拉菜单样式是自定义的.非原生效果:需要使用 setDropDownViewResource 方法来设置下拉视图的布局样式.该方法需要传入布局资源,该布局需要定义每个 Item 的属性,比如宽高和文字颜色等(为了使效果明显,我将每个 Item 的高度设置为 50 dp,文字设置为蓝

  • android studio 的下拉菜单Spinner使用详解

    一.认识Spinner Spinner其实就是一个列表选择框.不过Android的列表选择框并不需要显示下拉列表,而是相当于弹出一个菜单供用户选择. Spinner 与 Gallery 都继承了AbsSpinner,AbsSpinner 继承了AdapterView,因此它也表现出AdapterView的特征:只要为AdapterView提供Adapter即可. 1.相关属性 android:dropDownHorizontalOffset:设置列表框的水平偏移距离 android:dropDo

  • Android实现微信加号菜单模式

    本文实例为大家分享了Android实现微信加号菜单模式的具体代码,供大家参考,具体内容如下 在模仿微信过程中有一个加号菜单启动着实让我有点费心,因为我去掉了自带的标题栏,想通过OnCreateOptionMenu这段代码来实现传统的Menu显示显然是不可能了.所以在自定义创建的状态栏里添加了一个加号的ImageView,想通过监听ImageView的Onclick来触发Popumenu的创建.基本效果与微信相似,细节方面还需多多考究. 看具体代码如下: 1.监听之后创建Popumenu的java

  • Android 侧滑抽屉菜单的实现代码

    侧滑抽屉菜单 前言正文一.创建项目二.添加滑动菜单三.UI美化四.添加导航视图五.菜单分类六.动态菜单七.源码 运行效果图: 前言   滑动菜单相信都不会陌生,你可能见过很多这样的文章,但我的文章会给你不一样的阅读和操作体验. 正文   写博客,自然是从创建项目开始了,这样你可以更好的知道这个过程中经历了什么. 一.创建项目   项目就命名为DrawerDemo, 绝对的手把手教学,让你清楚每一步怎么做. 然后打开app下的build.gradle,在android{}闭包中添加如下代码: //

  • Android recyclerView横条指示器实现淘宝菜单模块

    电商首页菜单模块,可以横向滑动,底部的滑动位置指示器该如何实现呢? 实现思路: 1.上方横滑列表可以直接使用RecyclerView实现: 2.下方的指示器: (1).计算出RecyclerView划出屏幕的距离w1和剩余宽度w2的比例y,y = w1 / (总宽度w3 - 可使视区域宽度w4): (2).计算出指示器该移动的距离w5 = y * (指示器的总宽度w6 - 滑块宽度w7): (3).指示器布局实现: <RelativeLayout android:id="@ id/pare

  • Android实现微博菜单弹出效果

    先上Android仿微博菜单弹出效果图,这个截图不是很流畅,大家可以下载apk试一下. 说一下实现思路: 1.截取当前窗口,对图片做高斯模糊处理,将处理后的图片做popupwindow的背景图片: 2.创建popupwindow,完成布局,这儿要注意:View的移动范围是由parent的大小决定的,就是只能在parent的范围内移动: 3.给买个View添加进入动画,每个比前一个延期50ms播放动画,关闭窗口时相反: 4.为View的动画添加回弹插值器: MoreWindow.java窗口 pa

  • Android实现上下菜单双向滑动

    本文实例为大家分享了Android实现上下菜单双向滑动的具体代码,供大家参考,具体内容如下 这是研究了网上大神双向左右滑动后实现的上下双向滑动特效,有兴趣的朋友可以看下面代码,注释很详细,原理就是根据手指滑动的方向,来将上下两个布局进行显示与隐藏.主要用了onTouch方法,获取滑动的距离进行偏移. import android.content.Context; import android.os.AsyncTask; import android.util.AttributeSet; impo

  • Android底部菜单栏(RadioGroup+Fragment)美化

    众所周知,android的底部菜单栏太重要,平时项目一般都是需要用到的,但是网上关于这方面的demo做得太丑了,实在惨不忍睹,所以这里便用RadioGroup+Fragment的方式写了一个,顺便美化了一下,需要的可以看下. 效果图: 项目结构 MainActivity.java public class MainActivity extends AppCompatActivity { private FrameLayout frameLayout; private RadioGroup rad

  • Android自定义转盘菜单效果

    最近由于公司项目需要,需要开发一款转盘菜单,费了好大功夫搞出来了,下面分享下 样图 具体功能如下: import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.support.v7.app.AppCompatActivity; im

  • Android如何实现底部菜单固定到底部

    今天搞了很久的一个问题,导航菜单没有固定到底部,因为上面是ListView,可是没内容,于是就浮动上去了. 效果如下: 这里采用的是一个碎片,代码是: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"

随机推荐