activity悬浮效果的实现
程序员文章站
2022-05-29 10:48:06
...
先上效果图:
效果图看完 来总结实现
目前知道的两种方法:
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);
}
});
}
}
第二个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>
完毕。
上一篇: 为WordPress添加鼠标点击特效