Android仿虾米音乐播放器之布局介绍
来源:互联网 发布:有道实时翻译软件 编辑:程序博客网 时间:2024/04/30 00:36
正式的第一篇先讲布局,首先分析下面的图中所用的布局
侧滑用的是鸿洋大神写的侧滑控件,非常的好用,就是没有加入事件分发。代码如下,自定义的控件
public class SlidingMenu extends HorizontalScrollView{private LinearLayout mWapper;private ViewGroup mMenu;private ViewGroup mContent;private int mScreenWidth;private int mMenuWidth;// dpprivate int mMenuRightPadding = 50;private boolean once;private boolean isOpen =false;/** * 未使用自定义属性时,调用 * * @param context * @param attrs */public SlidingMenu(Context context, AttributeSet attrs){this(context, attrs, 0);}/** * 当使用了自定义属性时,会调用此构造方法 * * @param context * @param attrs * @param defStyle */public SlidingMenu(Context context, AttributeSet attrs, int defStyle){super(context, attrs, defStyle);// 获取我们定义的属性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:mMenuRightPadding = a.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics()));break;}}a.recycle();WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);mScreenWidth = outMetrics.widthPixels;}public SlidingMenu(Context context){this(context, null);}/** * 设置子View的宽和高 设置自己的宽和高 */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){if (!once){mWapper = (LinearLayout) getChildAt(0);mMenu = (ViewGroup) mWapper.getChildAt(0);mContent = (ViewGroup) mWapper.getChildAt(1);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){super.onLayout(changed, l, t, r, b);if (changed){this.scrollTo(mMenuWidth, 0);}}@Overridepublic boolean onTouchEvent(MotionEvent ev){int action = ev.getAction();switch (action){case MotionEvent.ACTION_UP:// 隐藏在左边的宽度int scrollX = getScrollX();if (scrollX >= mMenuWidth / 2){this.smoothScrollTo(mMenuWidth, 0);isOpen = false;} else{this.smoothScrollTo(0, 0);isOpen = true;}return true;}return super.onTouchEvent(ev);}/** * 打开菜单 */public void openMenu(){if (isOpen)return;this.smoothScrollTo(0, 0);isOpen = true;}public void closeMenu(){if (!isOpen)return;this.smoothScrollTo(mMenuWidth, 0);isOpen = false;}public boolean isOpen(){return isOpen;}/** * 切换菜单 */public void toggle(){if (isOpen){closeMenu();} else{openMenu();}}/** * 滚动发生时 */@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt){super.onScrollChanged(l, t, oldl, oldt);float scale = l * 1.0f / mMenuWidth; // 1 ~ 0/** * 区别1:内容区域1.0~0.7 缩放的效果 scale : 1.0~0.0 0.7 + 0.3 * scale * * 区别2:菜单的偏移量需要修改 * * 区别3:菜单的显示时有缩放以及透明度变化 缩放:0.7 ~1.0 1.0 - scale * 0.3 透明度 0.6 ~ 1.0 * 0.6+ 0.4 * (1- scale) ; * */float rightScale = 0.7f + 0.3f * scale;float leftScale = 1.0f - scale * 0.3f;float leftAlpha = 0.6f + 0.4f * (1 - scale);// 调用属性动画,设置TranslationXViewHelper.setTranslationX(mMenu, mMenuWidth * scale * 0.8f);ViewHelper.setScaleX(mMenu, leftScale);ViewHelper.setScaleY(mMenu, leftScale);ViewHelper.setAlpha(mMenu, leftAlpha);// 设置content的缩放的中心点ViewHelper.setPivotX(mContent, 0);ViewHelper.setPivotY(mContent, mContent.getHeight() / 2);ViewHelper.setScaleX(mContent, rightScale);ViewHelper.setScaleY(mContent, rightScale);}}
主布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:hyman="http://schemas.android.com/apk/res/com.sheepm.copyxiami" android:layout_width="match_parent" android:layout_height="match_parent" > <com.sheepm.Utils.SlidingMenu android:id="@+id/id_menu" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/personal_background_shadow_am" hyman:rightPadding="70dp" > <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="horizontal" > <include layout="@layout/menu_left" /> <LinearLayout android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/fragment_main" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </FrameLayout> <include layout="@layout/bottom_music" /> </LinearLayout> </LinearLayout> </com.sheepm.Utils.SlidingMenu></RelativeLayout>
其中 ,menu_left是左边侧滑的布局,下面的LinearLayout是主布局,其中由一个FrameLayout,和一个底部的播放条组成,这是为了使播放条相当于一个单例的模式,不会重复生成,界面上也比较友好,继续深入Framelayout,布局如下
layout/fragment_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#fff" > <ImageView android:id="@+id/nav_change" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" android:src="@drawable/default_artist_login_mini" /> <TextView android:id="@+id/tv_fragment_my" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="我的" android:textColor="#FA843A" android:textStyle="bold" /> <TextView android:id="@+id/tv_fragment_recommend" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="推荐" android:textStyle="bold" /> <TextView android:id="@+id/tv_fragment_music" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="乐章" android:textStyle="bold" /> <ImageView android:id="@+id/nav_search" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" android:src="@drawable/navigation_bar_btn_search" /> </LinearLayout> <include layout="@layout/line_d3d3d3" /> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </FrameLayout></LinearLayout>
在上面的LinearLayout中时主布局的我的、推荐、乐章等布局,下面又嵌入了一个FrameLayout,想要知道如何在FrameLayout中内嵌FrameLayout并进行操作,可以看我前面的文章 点击打开链接
整体的布局架构就是这样,其他小页面的布局就不赘述了,源码已开源,可以自己看看
0 0
- Android仿虾米音乐播放器之布局介绍
- Android仿虾米音乐播放器之开篇介绍
- Android仿虾米音乐播放器之本地音乐获取
- Android仿虾米音乐播放器之MediaPlayer使用
- Android仿虾米音乐播放器之service
- Android仿虾米音乐播放器之自定义进度条seekbar
- Android仿虾米音乐播放器之通知栏notification解析
- Android仿虾米音乐播放器之电话和耳机监听
- Android仿虾米音乐播放器之专辑图片模糊处理
- Android Project : FXiami 虾米音乐播放器
- Android音乐播放器之经典布局
- 虾米音乐--自制博客播放器
- 仿虾米音乐引导页面
- 工具使用--第3节 HEXO美化之添加虾米音乐播放器
- android之音乐播放器
- Android之音乐播放器
- Linux下的豆瓣FM音乐播放器和虾米音乐播放器
- 仿QQ音乐播放器
- cloud foundry pivotal
- Android Fragment 真正的完全解析(上)
- 【Spark】DAGScheduler源码浅析2
- 微信公众平台开发
- c++ 中的static
- Android仿虾米音乐播放器之布局介绍
- ios测试工具testflight
- KNN与Kmeans
- Android 有关View的绘制问题
- 配置tomcat实现随机启动
- C# winform 导出pdf报表
- JSP自定义标签
- Unity协程(Coroutine)管理类——TaskManager工具分享
- 美团推荐算法实践:机器学习重排序模型成亮点