activity悬浮效果的实现

来源:互联网 发布:哈扎尔辞典 知乎 编辑:程序博客网 时间:2024/06/06 05:04

先上效果图:




效果图看完 来总结实现

目前知道的两种方法:

1、将悬浮的activity样式改为dialog样式,

android:theme="@style/Base.Theme.AppCompat.Light.Dialog"
这个样式的宽高是内容包裹,显示出来的效果不好看,需要自己去修改它的样式。

2、使用WindowManager去设置activity的宽高,再把背景设为透明,就是一个悬浮效果。

下面上代码:

首先第一个activity的布局:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="example.com.floattest.MainActivity">    <android.support.design.widget.FloatingActionButton        android:id="@+id/fab_add"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@mipmap/add"        android:layout_alignParentRight="true"        android:layout_alignParentBottom="true"/></RelativeLayout>


使用了Material Design中的悬浮按钮,它是Design Support库中的一个控件,要使用Design Support库,在app下的gradle中添加如下:

compile 'com.android.support:design:25.1.1'

activity

package example.com.floattest;import android.content.Intent;import android.support.design.widget.FloatingActionButton;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;public class MainActivity extends AppCompatActivity {    private FloatingActionButton fab;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        fab = (FloatingActionButton)this.findViewById(R.id.fab_add);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent(MainActivity.this,FloatActivity.class);                startActivity(intent);            }        });    }}


FloatingActionButton的用法与Button一样,给它添加点击事件,使用Intent进入第二个activity。

第二个activity的布局:

<?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.support.v7.widget.RecyclerView        android:id="@+id/recycler_view"        android:layout_width="match_parent"        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></LinearLayout>
用RecyclerView做一个列表显示

activity

package example.com.floattest;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.Display;import android.view.Gravity;import android.view.MotionEvent;import android.view.WindowManager;import java.util.ArrayList;import java.util.List;/** * Created by csjy on 2017/6/30. */public class FloatActivity extends AppCompatActivity {    private RecyclerView recyclerView;    private List<String> mList;    private RecyclerViewAdapter adapter;    private WindowManager manager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_float);        manager = getWindowManager();        Display display = manager.getDefaultDisplay();        WindowManager.LayoutParams layoutParams = getWindow().getAttributes();        layoutParams.height = (int) (display.getHeight() * 0.95);        layoutParams.width = (int) (display.getWidth() * 0.8);        layoutParams.gravity = Gravity.CENTER_VERTICAL;        getWindow().setAttributes(layoutParams);        recyclerView = (RecyclerView)this.findViewById(R.id.recycler_view);        recyclerView.setLayoutManager(new LinearLayoutManager(this));        initData();        adapter = new RecyclerViewAdapter(this,mList);        recyclerView.setAdapter(adapter);    }    private void initData() {        mList = new ArrayList<String>();        for (int i = 0; i < 100; i++){            mList.add("Text" + i);        }    }    //点击空白处返回上一个activity    @Override    public boolean onTouchEvent(MotionEvent event) {        if (event.getAction() == MotionEvent.ACTION_DOWN){            if (getCurrentFocus() != null && getCurrentFocus().getWindowToken() != null){                finish();            }        }        return super.onTouchEvent(event);    }}

首先实例化WindowManager,通过WindowManager的getDefaultDisplay()方法实例化Display,Display提供窗口的大小及密度等有关信息。再通过WindowManager的LayoutParams设置一些宽高等属性。这里将activity的高设置为窗口大小的0.95倍,宽为窗口大小的0.8倍。然后实例化RecyclerView,添加数据。接下来添加手势相应事件,当点击activity以外的区域返回上一个activity,也就是销毁这个activity。


最后将悬浮的activity的样式改为:

android:theme="@style/Transparent"
其中Transparent的样式如下:

<style name="Transparent" parent="Theme.AppCompat.Light">        <item name="android:windowIsTranslucent">true</item><!--透明-->        <item name="android:backgroundDimEnabled">true</item><!--模糊-->        <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item> <!--activity出现动画-->    </style>

完毕。


源码下载


原创粉丝点击