欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

activity悬浮效果的实现

程序员文章站 2022-05-29 10:48:06
...

先上效果图:

activity悬浮效果的实现



效果图看完 来总结实现

目前知道的两种方法:

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>

完毕。


源码下载