Android实现侧滑菜单
Android中实现可滑动的Tab的3种方式
Android中实现可滑动的Tab的3种⽅式该⽅法会有⼀个Bug,当设置tabHost.setCurrentTab()为0时,ViewPager不显⽰(准确的说是加载),只有点击其他任意⼀个tab后才会加载。
有解的同学吼⼀声~~~~~~~Activity:复制代码代码如下:package com.swordy.demo.android.fragment;import java.util.Random;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentStatePagerAdapter;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import youtInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.TabHost;import android.widget.TabHost.OnTabChangeListener;import android.widget.TabWidget;import android.widget.TextView;import com.swordy.demo.android.R;import com.swordy.library.android.util.ELog;/*** 1. 使⽤TabHost和ViewPager组合实现⼀个可以滑动的tab* 2. bug:如果当前页为0,则ViewPager第⼀次不加载。
Android:UI控件DrawerLayout、Fragment、SlidingLayout侧滑菜单
Android:UI控件DrawerLayout、Fragment、SlidingLayout侧滑菜单DrawerLayout与Fragment的联用1.xml代码view sourceprint?01.<android.support.v4.widget.DrawerLayout02.xmlns:android="/apk/res/android"03.android:id="@+id/drawer_layout"04.android:layout_width="match_parent"05.android:layout_height="match_parent" >06.<FrameLayout07.android:id="@+id/fragment_layout"08.android:layout_width="match_parent"09.android:layout_height="match_parent" >10.</FrameLayout>11.<RelativeLayout12.android:id="@+id/menu_layout"13.android:layout_width="300dp"14.android:layout_height="match_parent"15.android:layout_gravity="l eft"16.android:background="#ff333333">17.<ListView18.android:id="@+id/menu_listView"android:layout_width="match_parent"20.android:layout_height="match_parent" >21.</ListView>22.</RelativeLayout>23.</android.support.v4.widget.DrawerLayout>2.MainActivity继承FragmentActivityview sourceprint?01.import android.os.Bundl e;02.import android.app.Activity;03.import android.support.v4.app.Fragment;04.import android.support.v4.app.FragmentActivity;05.import android.support.v4.app.FragmentTransaction; 06.import android.support.v4.widget.DrawerLayout;07.import android.view.Menu;08.import android.view.View;09.import android.widget.AdapterView;10.import android.widget.ArrayAdapter;11.import android.widget.ListView;12.import android.widget.RelativeLayout;13.import android.widget.AdapterView.OnItemClickListener;14.public class MainActivity extends FragmentActivity15.{16./** DrawerLayout与Fragment的联用18.* DrawerLayout相关:19.* 1.一般内容层使用framelayout20.* 2.slidingLayout需要设置一个layout_grative属性21.* 文档建议使用android:layout_gravity="start"22.*/23.24.public static final String[] TITLES =25.{ "Henry IV (1)", "Henry V", "Henry VIII", "Richard II", "Richard III", "Merchant of Venice", "Othell o", "King Lear" };26.private DrawerLayout mDrawer_layout;27.private RelativeLayout mMenu_layout;28.29.@Overrid e30.protected void onCreate(Bundl e savedInstanceState)31.{32.super.onCreate(savedInstanceState);33.setContentView(yout.activity_main);34.35.mDrawer_layout = (DrawerLayout) findViewById(R.id.drawer_layout);36.mMenu_layout = (RelativeLayout) findViewById(R.id.menu_layout);37.38.ListView menu_listview = (ListView) mMenu_layout.findViewById(R.id.menu_listView);39.40.menu_listview.setAdapter(new ArrayAdapter<String>(this,yout.simpl e_expandabl e_list_item_1, TITLES));41.42.//监听菜单43.menu_listview.setOnItemClickListener(new DrawerItemClickListener());44.45.}46.47.public class DrawerItemClickListener impl ements OnItemClickListener48.{49.@Overrid e50.public void onItemClick(AdapterView<?> parent, View view, int position, l ong id)51.{52.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();53.Fragment fragment = null;54.55.//根据item点击行号判断启用哪个Fragment56.switch (position)57.{58.case 0:59.fragment = new FirstFragment();60.break;61.case 1:62.fragment = new NextFragment();63.break;64.default:65.break;66.}67.ft.replace(R.id.fragment_layout, fragment);68.mit();69.70.mDrawer_layout.cl oseDrawer(mMenu_layout);//点击后关闭mMenu_layout 71.}72.73.}74.75.76.77.78.@Overrid e79.public bool ean onCreateOptionsMenu(Menu menu)80.{81.getMenuInflater().inflate(R.menu.main, menu);82.return true;83.}84.85.}3.Fragment类view sourceprint?01.import android.os.Bundl e;02.import android.support.v4.app.Fragment;03.import youtInflater;04.import android.view.View;05.import android.view.ViewGroup;06.public class FirstFragment extends Fragment07.{08.@Overrid e09.public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundl e savedInstanceState) 10.{11.View layout = inflater.inflate(yout.firstlayout, null);12.return layout;13.}14.}view sourceprint?01.public class NextFragment extends Fragment02.{03.@Overrid e04.public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundl e savedInstanceState) 05.{06.View layout = inflater.inflate(yout.nextlayout, null);07.return layout;08.}09.}来源:清源教育。
Android实现左右滑动效果的方法详解
Android实现左右滑动效果的⽅法详解本⽰例演⽰在Android中实现图⽚左右滑动效果。
关于滑动效果,在Android中⽤得⽐较多,本⽰例实现的滑动效果是使⽤ViewFlipper来实现的,当然也可以使⽤其它的View 来实现。
接下来就让我们开始实现这种效果。
为了⽅便⼤家理解,我们先来看⼀下效果图:复制代码代码如下:package com.android.flip;import android.app.Activity;import android.os.Bundle;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.view.GestureDetector.OnGestureListener;import android.view.animation.AnimationUtils;import android.widget.ImageView;import android.widget.ViewFlipper;/*** Android实现左右滑动效果* @Description: Android实现左右滑动效果* @File: MainActivity.java* @Package com.android.flip* @Author Hanyonglu* @Date 2012-02-12 上午10:44:04* @Version V1.0*/public class MainActivity extends Activity implements OnGestureListener { private ViewFlipper flipper;private GestureDetector detector;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);detector = new GestureDetector(this);flipper = (ViewFlipper) this.findViewById(R.id.ViewFlipper1);flipper.addView(addImageView(R.drawable.one));flipper.addView(addImageView(R.drawable.two));flipper.addView(addImageView(R.drawable.three));flipper.addView(addImageView(R.drawable.four));flipper.addView(addImageView(R.drawable.five));}private View addImageView(int id) {ImageView iv = new ImageView(this);iv.setImageResource(id);return iv;}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubreturn this.detector.onTouchEvent(event);}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {if (e1.getX() - e2.getX() > 120) {this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out)); this.flipper.showNext();return true;} else if (e1.getX() - e2.getX() < -120) {this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in)); this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out)); this.flipper.showPrevious();return true;}return false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}}复制代码代码如下:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><ViewFlipper android:id="@+id/ViewFlipper1"android:layout_width="fill_parent"android:layout_height="fill_parent"></ViewFlipper></LinearLayout>为了使其滑动时有⼀定的特效,我们需要加⼊Animation效果,说到Animation,我们先看下如何在Android中实现⾃定义Animation。
kotlin-----实现侧滑菜单
kotlin-----实现侧滑菜单废话少说,直接记录步骤。
在app的build.gradle中添加compile 'com.android.support:design:26.1.0'这⾥注意⼀下:design:26.1.0 是和 implementation 'com.android.support:appcompat-v7:26.1.0'的版本⼀致的使⽤实例,准备⼯作:新建⼀个menu组和⼀个header布局<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="/apk/res/android"><item android:id="@+id/menu_1"android:title="应⽤管理"/><item android:id="@+id/menu_2"android:title="消息中⼼"/></menu><?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/ic_launcher"/></LinearLayout>Activity布局:<?xml version="1.0" encoding="utf-8"?><android.support.v4.widget.DrawerLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/drawer_layout"tools:context=".view.DrawerLayoutUse"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="测试"/></LinearLayout><!--侧滑菜单--><!--android:layout_gravity="start"表⽰从左到右滑出,end表⽰从右到左--><LinearLayoutandroid:layout_width="320dp"android:layout_height="match_parent"android:background="@color/blue_btn_bg_pressed_color"android:layout_gravity="end"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="测试TextView"/></LinearLayout><android.support.design.widget.NavigationViewandroid:id="@+id/design_navigation_view"android:layout_width="320dp"android:layout_height="match_parent"app:headerLayout="@layout/header"app:menu="@menu/menu_left"android:layout_gravity="start"></android.support.design.widget.NavigationView></android.support.v4.widget.DrawerLayout>逻辑代码以及绑定事件class DrawerLayoutUse : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(yout.activity_drawer_layout)val view: View = design_navigation_view.getHeaderView(0)view.setOnClickListener{Log.e("DrawerLayoutUse","头部点击")}design_navigation_view.setNavigationItemSelectedListener({ item -> when (item.itemId) {R.id.menu_1 -> {val alertTool = AlertDialogUtils(this)alertTool.AlertTitleAndMessage("点击","按钮①","success") }R.id.menu_2 -> {val alertTool = AlertDialogUtils(this)alertTool.AlertTitleAndMessage("点击","按钮②","success") }}false})}}。
Android利用滑动菜单框架实现滑动菜单效果
Android利⽤滑动菜单框架实现滑动菜单效果之前我向⼤家介绍了史上最简单的滑动菜单的实现⽅式,相信⼤家都还记得。
如果忘记了其中的实现原理或者还没看过的朋友,请先去看⼀遍之前的⽂章,史上最简单的侧滑实现,因为我们今天要实现的滑动菜单框架也是基于同样的原理的。
之前的⽂章中在最后也提到了,如果是你的应⽤程序中有很多个Activity都需要加⼊滑动菜单的功能,那么每个Activity都要写上百⾏的代码才能实现效果,再简单的滑动菜单实现⽅案也没⽤。
因此我们今天要实现⼀个滑动菜单的框架,然后在任何Activity中都可以⼀分钟引⼊滑动菜单功能。
⾸先还是讲⼀下实现原理。
说是滑动菜单的框架,其实说⽩了也很简单,就是我们⾃定义⼀个布局,在这个⾃定义布局中实现好滑动菜单的功能,然后只要在Activity的布局⽂件⾥⾯引⼊我们⾃定义的布局,这个Activity就拥有了滑动菜单的功能了。
原理讲完了,是不是很简单?下⾯我们来动⼿实现吧。
在Eclipse中新建⼀个Android项⽬,项⽬名就叫做RenRenSlidingLayout。
新建⼀个类,名叫SlidingLayout,这个类是继承⾃LinearLayout的,并且实现了OnTouchListener接⼝,具体代码如下:public class SlidingLayout extends LinearLayout implements OnTouchListener {/*** 滚动显⽰和隐藏左侧布局时,⼿指滑动需要达到的速度。
*/public static final int SNAP_VELOCITY = 200;/*** 屏幕宽度值。
*/private int screenWidth;/*** 左侧布局最多可以滑动到的左边缘。
值由左侧布局的宽度来定,marginLeft到达此值之后,不能再减少。
*/private int leftEdge;/*** 左侧布局最多可以滑动到的右边缘。
android slidemenu 用法
android slidemenu 用法
在Android中,使用SlideMenu(滑动菜单)可以实现一个侧边栏效果,用户可以通过手势滑动或点击按钮来打开或关闭侧边栏。
下面是实现的步骤:
1. 选择继承ViewGroup来实现。
首先考虑子view的布局,即如何重写onLayout方法。
2. 可以像FrameLayout一样,将菜单的布局放在下面,内容的布局放在上面,通过上层内容视图的滑动来显示下面的视图。
3. 可以像LinearLayout一样,从左向右依次布局。
起始时,先向左滑动一段距离(菜单的宽度)以隐藏掉菜单。
4. 直接将菜单的布局放置在屏幕可见区域外。
如菜单布局的宽度为200,那么就可以使用`final int width= menuView.getMeasuredWidth(); yout(-width,0, 0, menuView.getMeasuredHeight());`。
你也可以试试DrawerLayout或SlidingMenu,这些方法比上述方法更好用。
如需了解更多关于Android SlideMenu的用法,你可以查阅其他相关的文档或源代码。
Android 3D滑动菜单实现及源代码
Android 3D滑动菜单完全解析,实现推拉门式的立体特效在上一篇文章中,我们学习了Camera的基本用法,并借助它们编写了一个例子,实现了类似于API Demos里的图片中轴旋转功能。
不过那个例子的核心代码是来自于API Demos中带有的Rotate3dAnimation这个类,是它帮助我们完成了所有的三维旋转操作,所有Matrix和Camera相关的代码也是封装在这个类中。
这样说来的话,大家心里会不会痒痒的呢?虽然学习了Camera的用法,但却没有按照自己的理解来实现一套非常炫酷的3D效果。
不要着急,今天我就带着大家一起来实现一种3D推拉门式的滑动菜单,而且完全不会借助任何API Demos里面的代码。
当然如果你还不是很了解Camera的使用方式,可以先去阅读我的上一篇文章Android中轴旋转特效实现,制作别样的图片浏览器。
关于滑动菜单的文章我也已经写过好几篇了,相信看过的朋友对滑动菜单的实现方式应该都已经比较熟悉了,那么本篇文章的重点就在于,如何在传统滑动菜单的基础上加入推拉门式的立体效果。
还不了解滑动菜单如何实现的朋友,可以去翻一翻我之前的文章。
说到这里我必须要吐槽一下了,最近发现有不少的网站和个人将我的文章恶意转走,而且还特意把第一行的原文地址信息去除掉。
更可气的是,在百度上搜索我文章的标题时,竟然先找到的是那些转载我文章的网站。
唉,伤心了,看来还是谷歌比较正常。
因此今天我也是在这里特别申明一下,我所写的所有文章均是首发于CSDN博客,如果你阅读这篇文章时是在别的网站,那么你将无法找到我前面所写的关于传统滑动菜单的文章,而且你的疑问和留言也将得不到解答。
下面还是回到正题,首先来讲一下这次的实现原理吧,其实传统的滑动菜单功能就是把菜单部分放在了下面,主布局放在了上面,然后根据手指滑动的距离来偏移主布局,让菜单部分得以显示出来就行了。
不过我们这次既然要做推拉门式的立体效果,就需要将传统的思维稍微转变一下,可以先让菜单部分隐藏掉,但却复制一个菜单的镜像并生成一张图片,然后在手指滑动的时候对这张图片进行三维操作,让它产生推拉门式的效果,等滑动操作结束的时候,才让真正的菜单显示出来,然后将这个图片隐藏。
android实现上下左右滑动界面布局
android实现上下左右滑动界⾯布局本⽂实例为⼤家分享了android实现滑动界⾯布局的具体代码,供⼤家参考,具体内容如下1.我使⽤的是ScrollView嵌套HorizontalScrollView让ScrollView负责上下滑动HorizontalScrollView负责左右滑动2.以下代码提供了思路和完成⼿段,请根据具体业务去进⾏修改,我试过使⽤recyclerview进⾏⾃定义,发现⼀旦有了复杂业务之后会掉帧卡顿所以使⽤了这种⽅法XML布局<?xml version="1.0" encoding="utf-8"?><.myapplication.PagerScrollViewxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><HorizontalScrollViewandroid:id="@+id/hor"android:layout_width="match_parent"android:background="#e1f1f1"android:layout_height="160dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center|left"android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor1"android:layout_width="match_parent" android:scrollbars="none"android:background="#a2f2f2"android:layout_height="160dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor2"android:layout_width="match_parent" android:scrollbars="none"android:background="#a2a2f2"android:layout_height="160dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor3"android:layout_width="match_parent" android:scrollbars="none"android:background="#f3f3f3"android:layout_height="160dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor4"android:layout_width="match_parent" android:scrollbars="none"android:background="#a4f4f4"android:layout_height="200dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor5"android:layout_width="match_parent" android:scrollbars="none"android:background="#f5f5f5"android:layout_height="200dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor6"android:layout_width="match_parent" android:scrollbars="none"android:background="#a5f5f5"android:layout_height="200dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView></LinearLayout></.myapplication.PagerScrollView> mainAvtivity的代码package .myapplication;import android.annotation.SuppressLint;import android.content.Context;import android.support.v7.app.AppCompatActivity; import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet;import android.util.Log;import youtInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.HorizontalScrollView;import android.widget.LinearLayout;import android.widget.ScrollView;import android.widget.TextView;import android.widget.Toast;import org.w3c.dom.Text;import ng.reflect.Array;import java.util.ArrayList;import java.util.List;/*** zhaohan creat 2019/3/6*/public class MainActivity extends AppCompatActivity { String TAG = "主程序";float mPosX;float mPosY;float mCurPosX;float mCurPosY;int offset=10;//偏移量int friction = 10;//摩擦⼒final List<HorizontalScrollView> list = new ArrayList();@SuppressLint("ClickableViewAccessibility")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);final PagerScrollView scrollView = findViewById(R.id.main);list.add((HorizontalScrollView) findViewById(R.id.hor));list.add((HorizontalScrollView) findViewById(R.id.hor1));list.add((HorizontalScrollView) findViewById(R.id.hor2));list.add((HorizontalScrollView) findViewById(R.id.hor3));list.add((HorizontalScrollView) findViewById(R.id.hor4));list.add((HorizontalScrollView) findViewById(R.id.hor5));list.add((HorizontalScrollView) findViewById(R.id.hor6));for(HorizontalScrollView horizontalScrollView:list){horizontalScrollView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mPosX = event.getX();mPosY = event.getY();Log.w(TAG,mPosY+"");break;case MotionEvent.ACTION_MOVE:mCurPosX = event.getX();mCurPosY = event.getY();case MotionEvent.ACTION_UP:if (mCurPosX - mPosX > 0 && (Math.abs(mCurPosX - mPosX) > offset)) {int speed = 10;//速度int distance = 20;//滑动距离if((Math.abs(mCurPosX - mPosX))>50){speed = (int) Math.abs(mCurPosX - mPosX)/friction;distance = (int) Math.abs(mCurPosX - mPosX)/3;//滑动距离}//向右滑動Log.w(TAG,"向右滑动了!");while(distance>0) {distance = distance - speed;for(HorizontalScrollView horizontalScrollView:list){horizontalScrollView.smoothScrollBy(distance, 0);}}return true;//true为屏蔽范围内的其他滑动监听} else if (mCurPosX - mPosX < 0 && (Math.abs(mCurPosX - mPosX) > offset)) { int speed = 10;//速度int distance = 20;//滑动距离if((Math.abs(mCurPosX - mPosX))>50){speed = (int) Math.abs(mCurPosX - mPosX)/friction;distance = (int) Math.abs(mCurPosX - mPosX)/3;//滑动距离}//向左滑动Log.w(TAG,"向左滑动了!");//改为滑动while(distance>0){distance=distance-speed;for(HorizontalScrollView horizontalScrollView:list){horizontalScrollView.smoothScrollBy(-distance,0 );}}return true;//true为屏蔽范围内的其他滑动监听}break;}return true;//true为屏蔽范围内的其他滑动监听}});}}}class PagerScrollView extends ScrollView {private float xDistance, yDistance, xLast, yLast;public PagerScrollView(Context context) {super(context);}public PagerScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public PagerScrollView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:xDistance = yDistance = 0f;xLast = ev.getX();yLast = ev.getY();break;case MotionEvent.ACTION_MOVE:final float curX = ev.getX();final float curY = ev.getY();xDistance += Math.abs(curX - xLast);yDistance += Math.abs(curY - yLast);xLast = curX;yLast = curY;/*** X轴滑动距离⼤于Y轴滑动距离,也就是⽤户横向滑动时,返回false,ScrollView不处理这次事件, * 让⼦控件中的TouchEvent去处理,所以横向滑动的事件交由ViewPager处理,* ScrollView只处理纵向滑动事件*/if (xDistance > yDistance) {return false;}}return super.onInterceptTouchEvent(ev);}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
navigationview的用法
navigationview的用法NavigationView是Android Jetpack中提供的一个视图组件,用于实现侧滑菜单和导航功能。
它通常是与DrawerLayout一起使用,并且可以很方便地实现应用程序的导航。
使用NavigationView的步骤如下:1. 在XML布局文件中定义NavigationView,通常放置在DrawerLayout中的一个侧滑抽屉中,示例如下:xml<android.support.v4.widget.DrawerLayoutandroid:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"><! 主要内容布局><android.support.design.widget.NavigationViewandroid:id="@+id/navigation_view"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="start"app:headerLayout="@layout/nav_header"app:menu="@menu/nav_menu" /></android.support.v4.widget.DrawerLayout>2. 定义NavigationView布局中的头部布局和菜单项布局。
头部布局可以通过``app:headerLayout``属性指定,菜单项布局可以通过``app:menu``属性指定。
[整理版]android完美slidingmenu滑动按钮
android完美slidingmenu滑动按钮想实现类似网易新闻的右滑出menu的那种效果(youTube也有那种效果),网上找了种种方法和代码例子,发现都达不到想要的效果。
发现他们大部分方法,不是重写HorizontalScrollView, 就是重写SlidingDrawer。
其实想像一下那个交互的直实情况,完全不用绕圏子,原理就可以是将上面的一个View拨开,将下面的View显示出来而以。
不如自己重写一个基本布局.先看一下做出来的效果吧,有人说没图说真相, 这个自己多嵌套了一层。
(每滑完一层,右边就变灰,表示不可操作了)右滑---------->再右滑---------->最大的特点是如果你要优化自己的代码成这个效果,代码改动量非常小,只需要调整一下布局,改改View的位置就可以了。
甚至代码可以不用修改。
下面看看实现过程首先,两个View是可以重叠的。
我们使用FrameLayout作为继承类。
命名为ScrollDrawerView这里要保证FrameLayout里有两个子View,做很多事情先都要先检测一下。
[java]view plaincopyprint?1. /**2. * 检查设置top, bottom3. * @return4. */5. private boolean checkTopBottomOk() {6. if (mBottomView != null && mTopView != null) {7. return mBottomView != mTopView;8. }9.10. int count = getChildCount();11. if (mBottomView == null && mTopView == null) {12. if (count != 2) {13. return false;14. } else {15. mBottomView = getChildAt(0);16. mTopView = getChildAt(1);17. return mBottomView != mTopView;18. }19. } else {20. if (count != 1) {21. return false;22. } else {23. View v = getChildAt(0);24. if (mBottomView != null) {25. mTopView = v;26. } else {27. mBottomView = v;28. }29. return mBottomView != mTopView;30. }31. }32. }33.34. /**35. * 设置(替换)抽屉的下层36. * @param v37. */38. public void setBottomView(View v) {39. this.addView(v, 0);40. mBottomView = v;41. }42.43. /**44. * 设置(替换)抽屉的上层45. * @param v46. */47. public void setTopView(View v) {48. this.addView(v, 1);49. mTopView = v;50. }需要灵活一点的话,就是继可以在layout文件中去配置View的位置,也可以在代码中进行设置。
【推荐下载】Android侧滑菜单的使用和配置(SlidingMenu)
Android 侧滑菜单的使用和配置(SlidingMenu)
2016/03/04 0 还是项目中学到的东西,我们在很多的应用中都能看到侧滑菜
单的使用,如下图所示:
首先要达到如上图所示的效果,我们可以找到高手写的slidingMenu 的开源代码
下载下来,我们需要用它,下载地址我会放到文章后,sliding_menu 下载下来是一
个工程项目,在此与普通的引包复制黏贴都不一样,在此讲述一下配置情况,很简
单
1 把下载好的Sliding_menu 当工程导入到开发工具中(我用的是Myeclipse)
在工程项目栏中——右键—— Import- Existing Projects into WorkSpace- Browse (选择下载好的sliding_menu 文件)- 然后点Finish
这样Sliding_menu 项目就被引入了如图
2 接下来新建项目cehuacaidan
然后就是Sliding_Menu 的配置问题,在cehuacaidan 项目上点右击-
点击Properties- 在点击Android-
点击Add-
---- 点击slidingmenu_library- 点OK
点击Apply- 点击OK 这个时候就把Slingding_menu 加入到了cehuacaidan 这个项目中,紧接着控制台就会出现这样的错误,如下图
问题出在这个android-support-v4.jar 这个jar 包出现在这个项目的两个地方,运行时程序不知道执行哪一处的jar 包,因此根据错误的提示,在提示的路径下找到。
AndroidStudio使用ViewPager+Fragment实现滑动菜单Tab效果
AndroidStudio使⽤ViewPager+Fragment实现滑动菜单Tab效果本⽂为⼤家分享了Android Studio实现滑动菜单Tab效果的具体代码,供⼤家参考,具体内容如下描述:之前有做过⼀个记账本APP,拿来练⼿的,做的很简单,是⽤Eclipse开发的;最近想把这个APP重新完善⼀下,添加了⼀些新的功能,并选⽤Android Studio来开发;APP已经完善了⼀部分,现在就想把已经做好的功能整理⼀下,记录下来。
效果图:可以⼿动滑动菜单也可以通过点击头部菜单进⾏切换具体实现的代码:前台代码(activity_main.xml):<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:layout_marginTop="1dp"android:background="@android:color/white"android:baselineAligned="false"android:gravity="center_vertical"android:orientation="horizontal"android:paddingBottom="5dp"android:paddingTop="5dp"><!--detail Tab--><TextViewandroid:id="@+id/item_detail"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center_horizontal|center_vertical"android:text="@string/detail_tab"android:textColor="@color/main_tab_text_color"android:textSize="20dp"/><!--category report Tab--><TextViewandroid:id="@+id/item_category_report"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center_horizontal|center_vertical"android:text="@string/category_report_tab"android:textColor="@color/main_tab_text_color"android:textSize="20dp"/></LinearLayout><android.support.v4.view.ViewPagerandroid:id="@+id/mainViewPager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout>主界⾯代码(MainActivity.java):package com.hyl.acccountbookdemo;import android.graphics.Color;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentPagerAdapter;import android.support.v4.view.ViewPager;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.TextView;import java.util.ArrayList;import java.util.List;/*** @programName: MainActivity.java* @programFunction: Recording of income and expenditure* @createDate: 2018/09/25* @author: AnneHan* @version:* xx. yyyy/mm/dd ver author comments* 01. 2018/09/25 1.00 AnneHan New Create*/public class MainActivity extends AppCompatActivity implements View.OnClickListener {private TextView item_detail, item_category_report;private ViewPager vp;private OneFragment oneFragment;private TwoFragment twoFragment;private List<Fragment> mFragmentList = new ArrayList<Fragment>();private FragmentAdapter mFragmentAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);initViews();mFragmentAdapter = new FragmentAdapter(this.getSupportFragmentManager(), mFragmentList); vp.setOffscreenPageLimit(2);//ViewPager的缓存为2帧vp.setAdapter(mFragmentAdapter);vp.setCurrentItem(0);//初始设置ViewPager选中第⼀帧item_detail.setTextColor(Color.parseColor("#1ba0e1"));//ViewPager的监听事件vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {/*此⽅法在页⾯被选中时调⽤*/changeTextColor(position);}@Overridepublic void onPageScrollStateChanged(int state) {/*此⽅法是在状态改变的时候调⽤,其中arg0这个参数有三种状态(0,1,2)。
Android实现手势滑动(左滑和右滑)
Android实现⼿势滑动(左滑和右滑)最近想实现Android左滑弹出菜单框,右滑消失菜单这个个功能。
了解了⼀下Android 的滑动事件,必须是在view组件或者Activity上实现,同时必须实现OnTouchListener, OnGestureListener这个两个接⼝。
public class MyRelativeLayout extends RelativeLayout implements GestureDetector.OnGestureListener{private float mPosX, mPosY, mCurPosX, mCurPosY;private static final int FLING_MIN_DISTANCE = 20;// 移动最⼩距离private static final int FLING_MIN_VELOCITY = 200;// 移动最⼤速度//构建⼿势探测器GestureDetector mygesture = new GestureDetector(this);public MyRelativeLayout(Context context){super(context)}public MyRelativeLayout(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}public MyRelativeLayout(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}@Overridepublic boolean onTouchEvent(MotionEvent arg0) {// TODO Auto-generated method stubreturn mDetector.onTouchEvent(arg0);}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stub// e1:第1个ACTION_DOWN MotionEvent// e2:最后⼀个ACTION_MOVE MotionEvent// velocityX:X轴上的移动速度(像素/秒)// velocityY:Y轴上的移动速度(像素/秒)// X轴的坐标位移⼤于FLING_MIN_DISTANCE,且移动速度⼤于FLING_MIN_VELOCITY个像素/秒//向左if (e1.getY() - e2.getY() > FLING_MIN_DISTANCE){// && Math.abs(velocityX) > FLING_MIN_VELOCITY) {collapse();}//向上if (e2.getY() - e1.getY() > FLING_MIN_DISTANCE&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {}return false;}}再添加⼀段实现⼿势滑动效果:⼿势滑动,其实也就是触摸事件public class PhoneGuard01 extends Activity {private GestureDetector mGestureDetector;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_phone_guard01);//创建⼿势识别对象,并创建⼿势识别的监听mGestureDetector = new GestureDetector(this,new SimpleOnGestureListener(){ //这个⽅法需要⾃⼰去重写@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {float X1=e1.getX();//获取按下去的坐标点,X轴float X2=e2.getX();//获取提起来的坐标点,Y轴float Y1=e1.getY();//获得按下去的Y轴坐标点float Y2=e1.getY();//获得提起来的Y轴坐标点//Y的移动距离,⽐X 的移动距离要⼤,所以不做任何的操作if(Math.abs(Y1-Y2)>Math.abs(X1-X2)){return false;}if(X1>X2){//表⽰下⼀页nextPage(null);}return super.onFling(e1, e2, velocityX, velocityY);}});}/**下⾯代码的意思就是说,把⾃⼰的⼿势识别的触摸事件,让⽗类去调⽤*///onTouchEvent(MotionEvent event)是继承来⾃View对象的@Overridepublic boolean onTouchEvent(MotionEvent event) {//mGestureDetector.onTouchEvent(event)是GestureDetector⾃⼰本⾝的mGestureDetector.onTouchEvent(event);return super.onTouchEvent(event);}//-----------------上⾯就是⼿势识别的代码实现------------------------------//跳转到下⼀个页⾯public void nextPage(View v){Intent intent=new Intent(this,PhoneGuard02.class);startActivity(intent);finish();}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Android侧滑菜单之DrawerLayout用法详解
Android侧滑菜单之DrawerLayout⽤法详解onConfigurationChanged最早的时候实现侧滑菜单功能⼤多时候需要通过github上⼀个叫做SlidingMenu的开源通过依赖包来实现,后来⾕歌在v4包中添加了DrawerLayout来实现这个功能,完全可以替代SlidingMenu,这⾥我们来学习DrawerLayout 的⽤法⼀)创建DrawerLayout1)在布局⽂件⾥将布局设置为DrawerLaout,⽽且因为是v4包中的功能,所以必须写全包名,注意第⼀必须先写主视图布局,然后再写抽屉⾥的视图,这⾥我们放了ListView进⼊抽屉<pre name="code" class="java"><android.support.v4.widget.DrawerLayoutxmlns:android="/apk/res/android"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"><!--The main content view 抽屉关闭时候的主视图--><FrameLayoutandroid:id="@+id/content_frame"android:layout_width="match_parent"android:layout_height="match_parent"></FrameLayout><!-- The Navigation view 左侧拉开之后的导航视图 --><ListViewandroid:id="@+id/left_drawer"android:layout_width="240dp"android:layout_height="match_parent"android:layout_gravity="start" //从左往右滑出菜单,如果为end就是从右往左滑出菜单android:background="#ffffcc"android:choiceMode="singleChoice"android:divider="@android:color/transparent"android:dividerHeight="0dp"></ListView></android.support.v4.widget.DrawerLayout>2)在activity⾥将DrawerLayout加载进来,并且给抽屉⾥的列表适配了数据,这样就将抽屉布局加载进来了。
Android侧滑原来可以这么优雅
侧滑手势在Android App应用得非常广泛,常见的使用场景包括:滑动抽屉、侧滑删除、侧滑返回、下拉刷新以及侧滑封面等。
由于这些使用场景实在是太通用了,各路大神们八仙过海各显神通,每种侧滑场景都开源出了很多非常实用的框架,让我们的业务开发便利了很多。
目前,我们需要为每种场景引入不同的侧滑框架,由于App中的侧滑场景很多,我们项目中也就需要引入多个侧滑框架,而每个框架的使用方式各有不同,需要单独学习,团队的学习成本较高。
那么问题来了,有没有一种框架能解决所有侧滑需求呢?一个框架解决所有侧滑需求?你确定不是在在刚开始学习面向对象编程概念的时候我们就知道一个道理:解决一个软件问题,首先要将它抽象出来。
针对侧滑这个手势,我们能不能将它的概念抽象一下,到底侧滑指的是什么呢?•狭义侧滑:从屏幕的某侧的边缘开始向着远离该边缘的方向滑动•广义侧滑:手指在屏幕上按下之后向着某一侧方向滑动我的理解是,广义侧滑包含狭义侧滑,只不过是触发区域是否在屏幕边缘的区别罢了。
于是,侧滑的概念就这样被清晰地抽象出来了。
从这个抽象概念可以看出:侧滑手势同一时间只处理上下左右4个方向中的一个方向如果我们将这个抽象概念封装出来,将手势事件的识别、拦截及数据加工在框架内部处理好,并向外实时地输出侧滑方向、距离及相关的回调,理论上我们就可以实现所有的侧滑需求了。
至于具体的侧滑效果,学过策略模式的都知道:每一种具体的侧滑效果实现都可以看做是一种侧滑策略。
胸抬,憋急!磨刀不误砍柴工,站在巨人的肩膀上你就有可能比巨人高那么一点点。
Google在android support库中为侧滑菜单的需求提供了SlidingPaneLayout和DrawerLayout两种实现,看源码会发现两者都是基于ViewDragHelper来实现的,那么ViewDragHelper又是何方神圣呢?ViewDragHelper是android support库中的一个工具类。
Android UI开发中如何实现左右滑出菜单
要让Android的应用程序中实现左右可滑出菜单只要根据以下的方法去做就可以了。
对于一些熟练的开发人员来说应该是不成问题的。
public class SlidingView extends ViewGroup {private FrameLayout mContainer;private Scroller mScroller;private VelocityTracker mVelocityTracker;private int mTouchSlop;private float mLastMotionX;private float mLastMotionY;private static final int SNAP_VELOCITY = 1000;private View mLeftView;private View mRightView;public SlidingView(Context context) {super(context);init();}public SlidingView(Context context, AttributeSet attrs) {super(context, attrs);init();}public SlidingView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mContainer.measure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {final int width = r - l;final int height = b - t;yout(0, 0, width, height);}private void init() {mContainer = new FrameLayout(getContext());mContainer.setBackgroundColor(0xff000000);mScroller = new Scroller(getContext());mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();super.addView(mContainer);}public void setView(View v) {if (mContainer.getChildCount() > 0) {mContainer.removeAllViews();}mContainer.addView(v);}@Overridepublic void scrollTo(int x, int y) {super.scrollTo(x, y);postInvalidate();}@Overridepublic void computeScroll() {if (!mScroller.isFinished()) {if (puteScrollOffset()) {int oldX = getScrollX();int oldY = getScrollY();int x = mScroller.getCurrX();int y = mScroller.getCurrY();if (oldX != x || oldY != y) {scrollTo(x, y);}。
Android自定义HorizontalScrollView实现qq侧滑菜单
Android⾃定义HorizontalScrollView实现qq侧滑菜单今天看了鸿洋_⼤神在慕课⽹讲的qq5.0侧滑菜单。
学了不少的知识,同时也佩服鸿洋_⼤神思路的清晰。
看了教程课下也⾃⼰实现了⼀下。
代码⼏乎完全相同别喷我啊。
没办法 o(︶︿︶)o 唉像素不好没办法找不到好的制作gif的软件。
我们暂且称侧滑左边界⾯的为menu,右边为content⾸先是menu的布局<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/img_frame_background" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"android:orientation="vertical" ><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content" ><ImageViewandroid:id="@+id/image1"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:src="@drawable/img_1" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_toRightOf="@id/image1"android:textColor="#ffffff"android:layout_marginLeft="20dp"android:text="第⼀个Item"android:textSize="20sp" /></RelativeLayout><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content" ><ImageViewandroid:id="@+id/image2"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:src="@drawable/img_2" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_toRightOf="@id/image2"android:textColor="#ffffff"android:layout_marginLeft="20dp"android:text="第⼆个Item"android:textSize="20sp" /></RelativeLayout><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content" ><ImageViewandroid:id="@+id/image3"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:src="@drawable/img_3" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_toRightOf="@id/image3"android:textColor="#ffffff"android:layout_marginLeft="20dp"android:text="第三个Item"android:textSize="20sp" /></RelativeLayout><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content" ><ImageViewandroid:id="@+id/image4"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:src="@drawable/img_4" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_toRightOf="@id/image4"android:textColor="#ffffff"android:layout_marginLeft="20dp"android:text="第四个Item"android:textSize="20sp" /></RelativeLayout><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content" ><ImageViewandroid:id="@+id/image5"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:src="@drawable/img_5" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_toRightOf="@id/image5"android:textColor="#ffffff"android:layout_marginLeft="20dp"android:text="第五个Item"android:textSize="20sp" /></RelativeLayout></LinearLayout></RelativeLayout>然后是主布局,⼀个⽔平滚动条,放⼊menu.xml,然后下⾯是⼀个线性垂直布局,背景是qq图⽚<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent" ><com.example.myhorizontalscrollview.MyHorizontalScrollViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:scrollbars="none"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="fill_parent"android:orientation="horizontal"><include layout="@layout/menu" /><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/qq" /></LinearLayout> </com.example.myhorizontalscrollview.MyHorizontalScrollView></RelativeLayout>其中的⽔平滚动条是我们⾃定义的view需要重写其中的两个⽅法@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// TODO Auto-generated method stubsuper.onLayout(changed, l, t, r, b);}通过设置偏移量,调整我们的初始布局,使menu全部隐藏,右侧菜单显现@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);}设置⼦view的宽* 因为HorizontalScrollView⾃⼰控制move和down的事件* 所以我们还要通过onTouchEvent判断⼀下up.如果当前的x偏移量⼤于menu宽度的⼀半 * 隐藏menu,否则显⽰menu 显⽰的时候通过smoothScrollTo(x, y)⽅法来实现动画的效果下⾯是所有的⾃定义的HorizontalScrollViewpackage com.example.myhorizontalscrollview;import android.annotation.SuppressLint;import android.content.Context;import android.text.GetChars;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.util.TypedValue;import android.view.MotionEvent;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.HorizontalScrollView;import android.widget.LinearLayout;public class MyHorizontalScrollView extends HorizontalScrollView {//滚动条中的⽔平先⾏布局private LinearLayout mWrpper;//⽔平线性布局的左侧菜单menuprivate ViewGroup mMenu;//⽔平先⾏布局的右侧线性布局private ViewGroup mContent;//屏幕的宽private int mScreenWidth;//menu的宽离屏幕右侧的距离private int mMenuRightPadding=50;//menu的宽度private int mMenuWidth;private boolean once;/*** 未使⽤⾃定义属性时调⽤* */public MyHorizontalScrollView(Context context, AttributeSet attrs) {super(context, attrs);/** 获取屏幕的宽度* 通过context拿到windowManager,在通过windowManager拿到Metrics,⽤DisplayMetrics接收* */WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);mScreenWidth=outMetrics.widthPixels;//把dp转换成pxmMenuRightPadding=(int) TypedValue.applyDimension(PLEX_UNIT_DIP, 50,context.getResources().getDisplayMetrics());}/** 设置⼦view的宽和⾼* */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubif(!once){mWrpper=(LinearLayout) getChildAt(0);mMenu=(ViewGroup) mWrpper.getChildAt(0);mContent=(ViewGroup) mWrpper.getChildAt(1);//menu的宽度等于屏幕的宽度减去menu离屏幕右侧的边距mMenuWidth=mMenu.getLayoutParams().width=mScreenWidth-mMenuRightPadding;//右边的先⾏布局的宽度直接等于屏幕的宽度mContent.getLayoutParams().width=mScreenWidth;once=true;}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}/** 通过设置偏移量将menu隐藏* */@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// TODO Auto-generated method stubsuper.onLayout(changed, l, t, r, b);/** 通过scrollTo(x,y)⽅法设置屏幕的偏移量,x为正* 内容向左移动* */if(changed){this.scrollTo(mMenuWidth, 0);}}/** 因为HorizontalScrollView⾃⼰控制move和down的事件* 所以我们还要判断⼀下up.如果当前的x偏移量⼤于menu宽度的⼀半* 隐藏menu,否则显⽰menu* */@Overridepublic boolean onTouchEvent(MotionEvent ev) {// TODO Auto-generated method stubint action=ev.getAction();switch(action){case MotionEvent.ACTION_UP:int scrollX=getScrollX();if(scrollX>=mMenuWidth/2){this.smoothScrollTo(mMenuWidth, 0);}else{this.smoothScrollTo(0, 0);}return true;}return super.onTouchEvent(ev);}}然后就是MainActivity加载布局就可以package com.example.slipping;import com.example.helloworld.R;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);}}以上就是本⽂的全部内容,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,同时也希望多多⽀持!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android实现侧滑菜单
侧滑菜单的实现在很多应用中都有所体现。
例如:QQ侧滑、微信侧滑等等,几乎是各个领域中的应用都有所涉及。
与此同时,实现侧滑的方式也是比比皆是。
下面为大家介绍其中一种的实现方式:自定义View实现侧滑菜单。
效果展示:
具体的使用自定义View实现之前先理解一下原始的实现原理:
1、使用ViewGroup存放2个View,一个是Menu菜单,一个是显示内容的Content
2、监听比比皆是onTouchEvent事件
处理ACTION_MOVE中的leftMargin位置,从而改变menu菜单的滑动位置
当ACTION_UP时,根据显示菜单的宽度,决定将其显示或隐藏动画效果:
(1)使用Scroller这个辅助类实现动画效果
(2)单起一个Thread(或Task)来改变leftMargin的大小来实现动画效果
3、使用自定义View实现侧滑菜单的实现原理:
(1)自定义HorizontalScrollView(可自动左右滑动)子类,重写构造方法、onMesure、onLayout、onTouchEvent方法。
[1] onMesure:决定内部View的宽和高
wallper = (LinearLayout) getChildAt(0);
// 获取menu(菜单布局)实例
menu = (ViewGroup) wallper.getChildAt(0);
// 获取content(内容布局)实例
content = (ViewGroup) wallper.getChildAt(1);
// 设置menu的宽度
menu_width = menu.getLayoutParams().width = screen_width
- menu_rightpadding;
// 设置content的宽度
content.getLayoutParams().width = screen_width;
[2] onLayout:决定子View的放置位置
// 为正值,表示为内容区域向左移动
if (changed) {
this.scrollTo(menu_width, 0);
}
[3]onTouchEvent:决定内部View的移动监听
case MotionEvent.ACTION_UP:
int scrollX = getScrollX();// 内容区域左侧多出来的部分--隐藏在左边的宽度
if (scrollX>= menu_width / 2) {
// smoothScrollTo隐藏(内容区域)效果相对缓和
this.smoothScrollTo(menu_width, 0);
isopen = false;
} else {// 内容区域左边与屏幕合并
this.smoothScrollTo(0, 0);
isopen = true;
}
returntrue;
[4]构造方法:(1)获取屏幕的宽度,以便于后面根据侧滑的比率判断是否显示
子菜单;
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetricsoutMetrics = new DisplayMetrics();
// 将当前窗口的信息放在DisplayMetrics中
manager.getDefaultDisplay().getMetrics(outMetrics);
screen_width = outMetrics.widthPixels;
(2)将菜单栏距右侧距离dp转换为像素值px
(自定义参数)menu_rightpadding = a.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(
PLEX_UNIT_DIP, 50,
context.getResources().getDisplayMetrics()));
(2)引入自定义属性,允许用户自定义菜单距离屏幕右侧的边距
[1] 书写xml文件
<resources>
<attr name="rightPadding"format="dimension"></attr>
<declare-styleable name="SlidingMenu">
<attr name="rightPadding"></attr>
</declare-styleable>
</resources>
[2]布局中添加自定义属性的xmlns
xmlns:auto="/apk/res/com.example.fragment_
horizontalscrollview"
[3]构造方法中实现
// 获取自定义的属性
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SlidingMenu, defStyle, 0);
int n = a.getIndexCount();
for (int i = 0; i< n; i++) {// 遍历所有属性
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.SlidingMenu_rightPadding:
menu_rightpadding = a.getDimensionPixelSize(attr,
(int) TypedValue.applyDimension(
PLEX_UNIT_DIP, 50, context
.getResources().getDisplayMetrics()));
Break;
default:
break;
}
}
(3)布局中引入自定义属性
auto:rightPadding="100dp"
(4)引入nineoldandroids-2.4.0.jar(提供较低版本兼容性)
nineoldandroids-2.4.0.jar
(5)主界面中调用切换方法。