国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android中Activity滑動(dòng)關(guān)閉的效果

2019-12-12 02:56:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最近感覺(jué)有一個(gè)Activity關(guān)閉的效果挺不錯(cuò)的,就是手勢(shì)滑動(dòng)就可以關(guān)閉當(dāng)前Activity,于是就想寫(xiě)一篇博客和大家一起分享下!廢話(huà)不多說(shuō),老規(guī)矩,還先上效果圖,更直觀!

這里寫(xiě)圖片描述

項(xiàng)目地址:https://github.com/xinyitiandi/SlidingFinishDemo

上代碼:

1.第一個(gè)Activity:

package com.ekeguan.slidingfinishdemo;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button button; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  initView();  initEventListener(); } private void initView() {  button = (Button) findViewById(R.id.button); } private void initEventListener() {  button.setOnClickListener(this); } @Override public void onClick(View view) {  switch(view.getId())  {   case R.id.button:    startActivity(new Intent(MainActivity.this,SecondActivity.class));    break;   default:    break;  } }}

布局文件:

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout 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" tools:context="com.ekeguan.slidingfinishdemo.MainActivity"> <Button  android:id="@+id/button"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="跳轉(zhuǎn)到第二個(gè)Activity"  app:layout_constraintBottom_toBottomOf="parent"  app:layout_constraintLeft_toLeftOf="parent"  app:layout_constraintRight_toRightOf="parent"  app:layout_constraintTop_toTopOf="parent" /></android.support.constraint.ConstraintLayout>

2.第二個(gè)Activity,即要跳轉(zhuǎn)的目標(biāo)Activity

package com.ekeguan.slidingfinishdemo;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;public class SecondActivity extends AppCompatActivity { private SildingFinishLayout mSildingFinishLayout; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_second);  initView();  initEventListener(); } private void initView() {  mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.sildingFinishLayout);  mSildingFinishLayout.setTouchView(mSildingFinishLayout); } private void initEventListener() {  mSildingFinishLayout    .setOnSildingFinishListener(new SildingFinishLayout.OnSildingFinishListener() {     @Override     public void onSildingFinish() {      finish();     }    }); }}

布局文件:

<?xml version="1.0" encoding="utf-8"?><com.ekeguan.slidingfinishdemo.SildingFinishLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/sildingFinishLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <FrameLayout  android:layout_width="match_parent"  android:layout_height="match_parent"  android:background="#f0f0f0">  <TextView   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:text="向右滑動(dòng)關(guān)閉當(dāng)前Activity"   android:layout_gravity="center"   android:textColor="#000"/> </FrameLayout></com.ekeguan.slidingfinishdemo.SildingFinishLayout>

注意:這里用到了一個(gè)自定義的布局SildingFinishLayout ,關(guān)于這個(gè)布局的代碼,我一會(huì)在下面貼出,大家不用著急。需要注意的是想要滑動(dòng)關(guān)閉的Activity的布局文件最外層要被SildingFinishLayout 布局包裹,被SildingFinishLayout 包裹的里面的布局設(shè)置背景色,如FrameLayout,我在這里設(shè)置了背景色為“#f0f0f0”,字體要設(shè)置字體顏色,如TextView,我在這里設(shè)置了“#000”

為了達(dá)到理想的效果,在AndroidMainfest.xml文件里面要給想要手勢(shì)滑動(dòng)的Activity添加上一個(gè)透明的主題,如:

<activity android:name=".SecondActivity"   android:screenOrientation="portrait"   android:theme="@style/Theme.AppCompat.Translucent"></activity>

主題:

<style name="Theme.AppCompat.Translucent">  <item name="android:windowBackground">@android:color/transparent</item>  <item name="android:colorBackgroundCacheHint">@null</item>  <item name="android:windowIsTranslucent">true</item>  <item name="windowActionBar">false</item>  <item name="windowNoTitle">true</item> </style>

好了,到這里差不多了,下面貼上自定義布局SildingFinishLayout的代碼:

package com.ekeguan.slidingfinishdemo;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.ViewConfiguration;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.RelativeLayout;import android.widget.ScrollView;import android.widget.Scroller;/** * 自定義可以滑動(dòng)的RelativeLayout, 類(lèi)似于IOS的滑動(dòng)刪除頁(yè)面效果,當(dāng)我們要使用 * 此功能的時(shí)候,需要將該Activity的頂層布局設(shè)置為SildingFinishLayout, * 然后需要調(diào)用setTouchView()方法來(lái)設(shè)置需要滑動(dòng)的View * * @author xiaanming * * @blog http://blog.csdn.net/xiaanming * */public class SildingFinishLayout extends RelativeLayout implements  OnTouchListener { /**  * SildingFinishLayout布局的父布局  */ private ViewGroup mParentView; /**  * 處理滑動(dòng)邏輯的View  */ private View touchView; /**  * 滑動(dòng)的最小距離  */ private int mTouchSlop; /**  * 按下點(diǎn)的X坐標(biāo)  */ private int downX; /**  * 按下點(diǎn)的Y坐標(biāo)  */ private int downY; /**  * 臨時(shí)存儲(chǔ)X坐標(biāo)  */ private int tempX; /**  * 滑動(dòng)類(lèi)  */ private Scroller mScroller; /**  * SildingFinishLayout的寬度  */ private int viewWidth; /**  * 記錄是否正在滑動(dòng)  */ private boolean isSilding; private OnSildingFinishListener onSildingFinishListener; private boolean isFinish; public SildingFinishLayout(Context context, AttributeSet attrs) {  this(context, attrs, 0); } public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {  super(context, attrs, defStyle);  mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();  mScroller = new Scroller(context); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) {  super.onLayout(changed, l, t, r, b);  if (changed) {   // 獲取SildingFinishLayout所在布局的父布局   mParentView = (ViewGroup) this.getParent();   viewWidth = this.getWidth();  } } /**  * 設(shè)置OnSildingFinishListener, 在onSildingFinish()方法中finish Activity  *  * @param onSildingFinishListener  */ public void setOnSildingFinishListener(   OnSildingFinishListener onSildingFinishListener) {  this.onSildingFinishListener = onSildingFinishListener; } /**  * 設(shè)置Touch的View  *  * @param touchView  */ public void setTouchView(View touchView) {  this.touchView = touchView;  touchView.setOnTouchListener(this); } public View getTouchView() {  return touchView; } /**  * 滾動(dòng)出界面  */ private void scrollRight() {  final int delta = (viewWidth + mParentView.getScrollX());  // 調(diào)用startScroll方法來(lái)設(shè)置一些滾動(dòng)的參數(shù),我們?cè)赾omputeScroll()方法中調(diào)用scrollTo來(lái)滾動(dòng)item  mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,    Math.abs(delta));  postInvalidate(); } /**  * 滾動(dòng)到起始位置  */ private void scrollOrigin() {  int delta = mParentView.getScrollX();  mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,    Math.abs(delta));  postInvalidate(); } /**  * touch的View是否是AbsListView, 例如ListView, GridView等其子類(lèi)  *  * @return  */ private boolean isTouchOnAbsListView() {  return touchView instanceof AbsListView ? true : false; } /**  * touch的view是否是ScrollView或者其子類(lèi)  *  * @return  */ private boolean isTouchOnScrollView() {  return touchView instanceof ScrollView ? true : false; } @Override public boolean onTouch(View v, MotionEvent event) {  switch (event.getAction()) {   case MotionEvent.ACTION_DOWN:    downX = tempX = (int) event.getRawX();    downY = (int) event.getRawY();    break;   case MotionEvent.ACTION_MOVE:    int moveX = (int) event.getRawX();    int deltaX = tempX - moveX;    tempX = moveX;    if (Math.abs(moveX - downX) > mTouchSlop      && Math.abs((int) event.getRawY() - downY) < mTouchSlop) {     isSilding = true;     // 若touchView是AbsListView,     // 則當(dāng)手指滑動(dòng),取消item的點(diǎn)擊事件,不然我們滑動(dòng)也伴隨著item點(diǎn)擊事件的發(fā)生     if (isTouchOnAbsListView()) {      MotionEvent cancelEvent = MotionEvent.obtain(event);      cancelEvent        .setAction(MotionEvent.ACTION_CANCEL          | (event.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));      v.onTouchEvent(cancelEvent);     }    }    if (moveX - downX >= 0 && isSilding) {     mParentView.scrollBy(deltaX, 0);     // 屏蔽在滑動(dòng)過(guò)程中ListView ScrollView等自己的滑動(dòng)事件     if (isTouchOnScrollView() || isTouchOnAbsListView()) {      return true;     }    }    break;   case MotionEvent.ACTION_UP:    isSilding = false;    if (mParentView.getScrollX() <= -viewWidth / 2) {     isFinish = true;     scrollRight();    } else {     scrollOrigin();     isFinish = false;    }    break;  }  // 假如touch的view是AbsListView或者ScrollView 我們處理完上面自己的邏輯之后  // 再交給AbsListView, ScrollView自己處理其自己的邏輯  if (isTouchOnScrollView() || isTouchOnAbsListView()) {   return v.onTouchEvent(event);  }  // 其他的情況直接返回true  return true; } @Override public void computeScroll() {  // 調(diào)用startScroll的時(shí)候scroller.computeScrollOffset()返回true,  if (mScroller.computeScrollOffset()) {   mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());   postInvalidate();   if (mScroller.isFinished()) {    if (onSildingFinishListener != null && isFinish) {     onSildingFinishListener.onSildingFinish();    }   }  } } public interface OnSildingFinishListener {  public void onSildingFinish(); }}

最后項(xiàng)目地址:https://github.com/xinyitiandi/SlidingFinishDemo

以上所述是小編給大家介紹的Android中Activity滑動(dòng)關(guān)閉的效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)網(wǎng)站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 龙江县| 嘉善县| 托克逊县| 准格尔旗| 无棣县| 鸡西市| 黑龙江省| 忻州市| 县级市| 沁水县| 馆陶县| 昆明市| 罗田县| 博罗县| 洞头县| 兴国县| 甘泉县| 万源市| 宁南县| 米脂县| 临武县| 安泽县| 五家渠市| 建宁县| 南华县| 德令哈市| 阿巴嘎旗| 鲁山县| 托里县| 武陟县| 晋城| 平陆县| 长汀县| 乌兰浩特市| 南召县| 荥经县| 牙克石市| 田阳县| 洛隆县| 黄山市| 富源县|