您的位置:首页 > 移动开发 > 微信开发

android 仿微信右滑返回

2017-06-02 16:52 393 查看
有这么一个开源项目,封装的右滑返回, 如果安卓基础不错的,可以 直接看源码: https://github.com/bingoogolapple/BGASwipeBackLayout-Android
以下是我单独分离出来一个仿微信右滑返回的小demo.

以下为效果图



下面是实现过程:

1.首页要依赖如下包:

 compile 'cn.bingoogolapple:bga-swipebacklayout:1.0.8@aar'

2. 新建 App 用来初始化swipebacklayout控件

public class App extends Application {

@Override
public void onCreate() {
super.onCreate();

// 必须在 Application 的 onCreate 方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回
BGASwipeBackManager.getInstance().init(this);
}
}


并且,在mainifest.xml里面更改默认的Application,改为 App

3.封装一个BaseActivity 让所有有右滑返回功能的Activity 继承

public abstract class BaseActivity extends AppCompatActivity implements BGASwipeBackHelper.Delegate, View.OnClickListener {
protected BGASwipeBackHelper mSwipeBackHelper;
protected Toolbar mToolbar;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
// 「必须在 Application 的 onCreate 方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回」
// 在 super.onCreate(savedInstanceState) 之前调用该方法
initSwipeBackFinish();
super.onCreate(savedInstanceState);

initView(savedInstanceState);
mToolbar = getViewById(R.id.toolbar);

setListener();
processLogic(savedInstanceState);
}

/**
* 初始化滑动返回。在 super.onCreate(savedInstanceState) 之前调用该方法
*/
private void initSwipeBackFinish() {
mSwipeBackHelper = new BGASwipeBackHelper(this, this);

// 「必须在 Application 的 onCreate 方法中执行 BGASwipeBackManager.getInstance().init(this) 来初始化滑动返回」
// 下面几项可以不配置,这里只是为了讲述接口用法。

// 设置滑动返回是否可用。默认值为 true
mSwipeBackHelper.setSwipeBackEnable(true);
// 设置是否仅仅跟踪左侧边缘的滑动返回。默认值为 true
mSwipeBackHelper.setIsOnlyTrackingLeftEdge(true);
// 设置是否是微信滑动返回样式。默认值为 true
mSwipeBackHelper.setIsWeChatStyle(true);
// 设置阴影资源 id。默认值为 R.drawable.bga_sbl_shadow
mSwipeBackHelper.setShadowResId(R.drawable.bga_sbl_shadow);
// 设置是否显示滑动返回的阴影效果。默认值为 true
mSwipeBackHelper.setIsNeedShowShadow(true);
// 设置阴影区域的透明度是否根据滑动的距离渐变。默认值为 true
mSwipeBackHelper.setIsShadowAlphaGradient(true);
// 设置触发释放后自动滑动返回的阈值,默认值为 0.3f
mSwipeBackHelper.setSwipeBackThreshold(0.3f);
}

/**
* 是否支持滑动返回。这里在父类中默认返回 true 来支持滑动返回,如果某个界面不想支持滑动返回则重写该方法返回 false 即可
*
* @return
*/
@Override
public boolean isSupportSwipeBack() {
return true;
}

/**
* 正在滑动返回
*
* @param slideOffset 从 0 到 1
*/
@Override
public void onSwipeBackLayoutSlide(float slideOffset) {
}

/**
* 没达到滑动返回的阈值,取消滑动返回动作,回到默认状态
*/
@Override
public void onSwipeBackLayoutCancel() {
}

/**
* 滑动返回执行完毕,销毁当前 Activity
*/
@Override
public void onSwipeBackLayoutExecuted() {
mSwipeBackHelper.swipeBackward();
}

@Override
public void onBackPressed() {
// 正在滑动返回的时候取消返回按钮事件
if (mSwipeBackHelper.isSliding()) {
return;
}
mSwipeBackHelper.backward();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}

/**
* 初始化布局以及View控件
*/
protected abstract void initView(Bundle savedInstanceState);

/**
* 给View控件添加事件监听器
*/
protected abstract void setListener();

/**
* 处理业务逻辑,状态恢复等操作
*
* @param savedInstanceState
*/
protected abstract void processLogic(Bundle savedInstanceState);

/**
* 需要处理点击事件时,重写该方法
*
* @param v
*/
public void onClick(View v) {
}

/**
* 查找View
*
* @param id   控件的id
* @param <VT> View类型
* @return
*/
protected <VT extends View> VT getViewById(@IdRes int id) {
return (VT) findViewById(id);
}

@Override
protected void onStop() {
super.onStop();
Log.i(this.getClass().getSimpleName(), "onStop " + this.getClass().getSimpleName());
}
}


4. 使用两个测试Activity

MainActiivty.java

public class MainActivity extends BaseActivity {

@Override
protected void initView(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
}

@Override
protected void setListener() {

}

@Override
protected void processLogic(Bundle savedInstanceState) {
initToolbar();
}

private void initToolbar() {
setSupportActionBar(mToolbar);
getSupportActionBar().setTitle("测试滑动删除 MainActivity");
TextView tv = getViewById(R.id.tv);
tv.setText("MainActivity");

Button btn = getViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSwipeBackHelper.forward(TestActivity.class);
}
});

}
}


TextActivity.java

public class TestActivity extends BaseActivity {
@Override
protected void initView(Bundle savedInstanceState) {
setContentView(R.layout.activity_test);
}

@Override
protected void setListener() {

}

@Override
protected void processLogic(Bundle savedInstanceState) {
initToolbar();
}

private void initToolbar() {
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("测试滑动删除 TestActivity");

TextView tv = getViewById(R.id.tv);
tv.setText("TestActivity");
}

}


两个布局文件:(这里要给根布局设置背景颜色,不然增加样式后activity会为透明)

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:fitsSystemWindows="true"

4000
android:orientation="vertical"
tools:context="com.bxn.swipedemo.MainActivity">

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:elevation="0dp">

<include layout="@layout/inc_toolbar" />

</android.support.design.widget.AppBarLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textColor="@color/colorAccent" />

<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="btn" />

</LinearLayout>
</android.support.design.widget.CoordinatorLayout>


activity_test.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context="com.bxn.swipedemo.TestActivity">

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:elevation="0dp">

<include layout="@layout/inc_toolbar" />

</android.support.design.widget.AppBarLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

<TextView
android:id="@+id/tv"
android:textColor="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
/>

<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="btn" />

</LinearLayout>
</android.support.design.widget.CoordinatorLayout>


inc_toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
style="@style/Toolbar"/>


5.这里要设置 Actiivty的样式

styles.xml

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>

<style name="Toolbar">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">?attr/actionBarSize</item>
<item name="android:background">?attr/colorPrimary</item>
<item name="android:theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
<item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
</style>

<!-- 适用于开启滑动返回功能的 Activity -->
<style name="AppTheme.Transparent">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
</style>

</resources>


mainfest.xml 中的设置

<activity
android:name=".MainActivity"
android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity
android:name=".TestActivity"
android:theme="@style/AppTheme.Transparent"
android:windowSoftInputMode="stateHidden|adjustResize" />


这样就完成这个功能 了,如下是demo源码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐