28 自定义View侧滑栏
ScrollMenuView.java
package com.qf.sxy.customview03.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
/**
* Created by sxy on 2016/9/29.
* 侧滑菜单 左右滚动
*/
public class ScrollMenuView extends HorizontalScrollView {
//ScrollView容器 菜单 内容
private LinearLayout container;
//菜单
private LinearLayout menuLayout;
//内容
private LinearLayout contentLayout;
//获取屏幕宽度
private int mScreenWidth =0;
//菜单展示出来 距离右边屏幕的距离
private int menuRightPadding = 200;
//计算出菜单的宽度
private int menuWidth = 0;
//标记 是否测量过宽度 测量过 不用再次去测
private boolean isMeasure = false;
private boolean isOpen = false;
public ScrollMenuView(Context context) {
super(context);
}
public ScrollMenuView(Context context, AttributeSet attrs) {
super(context, attrs);
//获取整个屏幕宽度
mScreenWidth = getResources().getDisplayMetrics().widthPixels;
}
/**
* 测量自身容器大小
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(!isMeasure){
//获取第一个子元素 容器Layout
container = (LinearLayout) getChildAt(0);
//获取菜单
menuLayout = (LinearLayout) container.getChildAt(0);
//获取 内容
contentLayout = (LinearLayout) container.getChildAt(1);
//得到菜单的宽度
menuWidth = mScreenWidth-menuRightPadding;
//设置菜单的宽度
menuLayout.getLayoutParams().width = menuWidth;
//设置内容宽度大小
contentLayout.getLayoutParams().width = mScreenWidth;
//标记测量过了
isMeasure = true;
}
}
/**
* 子View的位置
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
//如果改变让ScrollView进行滑动 默认状态 隐藏
if(changed){
scrollTo(menuWidth,0);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_UP://抬起
//ScrollView滑动距离
int scrollX = getScrollX();
//x轴滑动的距离 大于菜单宽度1/2 关闭菜单
if(scrollX>menuWidth/2){
smoothScrollTo(menuWidth,0);
Log.e("fmy","关闭");
isOpen = true;
}else{
//x轴滑动的距离 小于菜单宽度1/2 打开菜单
smoothScrollTo(0,0);
Log.e("fmy","开启");
isOpen = false;
}
//Up事件自身处理
return true;
}
//Down move的事件
//交给父类处理
return super.onTouchEvent(ev);
}
//开关
public void toggle(){
Log.e("AAA","==>"+isOpen);
if(isOpen){
closeContent();
}else{
openContent();
}
}
//打开内容
private void openContent() {
if(isOpen){
return;
}
Log.e("fmy","关闭");
smoothScrollTo(menuWidth,0);
isOpen = true;
}
//打开菜单
private void closeContent() {
if(!isOpen){
return;
}
Log.e("fmy","开启");
smoothScrollTo(0,0);
isOpen = false;
}
}
MainActivity.java
package com.qf.sxy.customview03;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.qf.sxy.customview03.widget.ScrollMenuView;
public class MainActivity extends AppCompatActivity {
private ScrollMenuView scrollMenuView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scrollMenuView = ((ScrollMenuView) findViewById(R.id.scrollMenuView));
}
//开关
public void Myclick(View view) {
scrollMenuView.toggle();
}
}
activity_main.xml
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.qf.sxy.customview03.MainActivity">
<com.qf.sxy.customview03.widget.ScrollMenuView
android:id="@+id/scrollMenuView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
"<!-- android:scrollbars="none-->
<LinearLayout
android:id="@+id/container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--菜单-->
<LinearLayout
android:id="@+id/menu_layout"
android:layout_width="wrap_content"
android:orientation="vertical"
android:background="@mipmap/img_frame_background"
android:layout_height="match_parent">
</LinearLayout>
<!--内容-->
<LinearLayout
android:id="@+id/content_layout"
android:orientation="vertical"
android:background="@mipmap/qq"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开关"
android:onClick="Myclick"/>
</LinearLayout>
</LinearLayout>
</com.qf.sxy.customview03.widget.ScrollMenuView>
</RelativeLayout>
28 自定义View侧滑栏的更多相关文章
- 28自定义View 模仿联系人字母侧栏
自定义View LetterView.java package com.qf.sxy.customview02; import android.content.Context; import andr ...
- 28 自定义View画坐标和柱状图
自定义View类 RectView.java package com.qf.sxy.day29_customview.widget; import android.content.Context; i ...
- 28 自定义View流式布局
流式布局每行的行高以本行中最高的元素作为高,如果一个元素放不下到一行时直接到第二行 FlowLayoutView package com.qf.sxy.customview05.widget; imp ...
- Android 自定义View修炼-打造完美的自定义侧滑菜单/侧滑View控件
一.概述 在App中,经常会出现侧滑菜单,侧滑滑出View等效果,虽然说Android有很多第三方开源库,但是实际上 咱们可以自己也写一个自定义的侧滑View控件,其实不难,主要涉及到以下几个要点: ...
- 【Android - 自定义View】之自定义颜色渐变的Tab导航栏
首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 GradientTab ,继承自View类: (2)这个自定义View实现了颜色渐变的Tab导航栏(仿微信主菜单),用户在左右滑 ...
- Android自定义View——实现字母导航栏
1.自定义View实现字母导航栏 2.ListView实现联系人列表 3.字母导航栏滑动事件处理 4.字母导航栏与中间字母的联动 5.字母导航栏与ListView的联动 1.先看主布局,方便后面代码的 ...
- 自定义view实现侧滑菜单
自定义View public class SlidingMenu extends HorizontalScrollView { private int mScreenWidth; private in ...
- 安卓开发28:自定义View类
自定义View类 通过自定义View类,可以自定义复杂的,按照自己需求的控件. 一个简单的例子 mainActivity.java 这个里面就是最普通的代码,但是给自定义的控件加上了一个onclick ...
- 【Android进阶】使用Andbase快速开发框架实现常见侧滑栏和滑动标签页组合效果
最近闲来无事,在网上寻找源代码看,突然发现了一个国内技术牛人开发的快速开发框架Andbase,花了一天时间研究了下源码和怎么使用,现将开发常见的侧滑栏和滑动标签页组合效果的使用介绍个大家,希望可以减少 ...
随机推荐
- [LeetCode] Can Place Flowers 可以放置花
Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, ...
- 前端小白想要编写可维护的js
我是一名前端小白,之前没写过多少代码,心里没有代码质量这个概念,人人都说代码是团队的产物,应该将代码写规范,但是我对具体什么样的代码是可维护的是茫然的. 我没写过多少代码,本来好多东西就不咋会,每次给 ...
- [ZJOI 2012]灾难
Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生 ...
- 【BZOJ2186】【SDOI2008】沙拉公主的困惑
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁 ...
- 2015 多校联赛 ——HDU5303(贪心)
Delicious Apples Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- solr6.6初探之主从同步
1.关于solr索引数据同步 通常情况下,单节点部署的solr应用很难在并发量很大的情况下"久存",那么多节点部署提高Solr应用的负载量和响应时间势在必行. solr索引同步有以 ...
- 如何为分布式系统优雅的更换RPC
为啥需要更换RPC? 很多小伙伴都遇到过需要为分布式系统调用更换RPC的问题,为什么会遇到这种事呢?其实,在系统搭建初期,需求简单,架构简单,最重要的是请求量也少,所以很多系统都采用快速原型开发模式, ...
- 四柱加强版汉诺塔HanoiTower----是甜蜜还是烦恼
我想很多人第一次学习递归的时候,老师或者书本上可能会举汉诺塔的例子. 但是今天,我们讨论的重点不是简单的汉诺塔算法,而是三柱汉诺塔的延伸.先来看看经典的三柱汉诺塔. 一.三柱汉诺塔(Hanoi_Thr ...
- FastReport报表MVC显示步骤
FastReport报表MVC使用步骤如下: 1.创建MVC网站项目 最终DEMO如下图所示 2.引用相关DLL FastReport.dll FastReport.Web.dll 3.Web.con ...
- OpenCV设置摄像头分辨率及全屏显示
OpenCV3.0下 设置摄像头分辨率为1920*1440,并全屏显示图像窗口. int _tmain(int argc, _TCHAR* argv[]) { Mat frame; VideoCapt ...