activity悬浮效果的实现

先上效果图:

activity悬浮效果的实现_第1张图片



效果图看完 来总结实现

目前知道的两种方法:

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

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

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

下面上代码:

首先第一个activity的布局:





    




使用了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的布局:




    

用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 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();
        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的样式如下:

完毕。


源码下载


你可能感兴趣的:(android开发相关)