android UI设计及开发
一、viewPager实现左右滑动及导引功能
1,如果每个屏幕只是一个简单的布局,如果简单的话,定义一个arraryIist<View>,利用addview将所有的布局加载,
然后为viewpager定义一个adapter。对于页面内部控件的处理事件在instantiateItem中进行处理。
2,如果每一个屏幕的布局,相对复杂的话,可以将其封装为一个类,在这个类中给页面内部对应的组件添加点击事件。
package com.slide.menu; import java.util.ArrayList; import com.slide.util.SlideMenuUtil; import android.app.Activity;
import android.graphics.Color;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; /**
* 顶部滑动菜单布局设置
* @Description: 顶部滑动菜单布局设置 * @FileName: SlideMenuLayout.java * @Package com.slide.menu * @Author Hanyonglu * @Date 2012-4-20 上午11:17:31 * @Version V1.0
*/
public class SlideMenuLayout {
// 包含菜单的ArrayList
private ArrayList<TextView> menuList = null; private Activity activity;
private TextView textView = null;
private SlideMenuUtil menuUtil = null; public SlideMenuLayout(Activity activity){
this.activity = activity;
menuList = new ArrayList<TextView>();
menuUtil = new SlideMenuUtil();
} /**
* 顶部滑动菜单布局
* @param menuTextViews
* @param layoutWidth
*/
public View getSlideMenuLinerLayout(String[] menuTextViews,int layoutWidth){
// 包含TextView的LinearLayout
LinearLayout menuLinerLayout = new LinearLayout(activity);
menuLinerLayout.setOrientation(LinearLayout.HORIZONTAL); // 参数设置
LinearLayout.LayoutParams menuLinerLayoutParames = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT,
1);
menuLinerLayoutParames.gravity = Gravity.CENTER_HORIZONTAL; // 添加TextView控件
for(int i = 0;i < menuTextViews.length; i++){
//形成textview标签<textView>
TextView tvMenu = new TextView(activity); // 设置标识值(menuTextView是从外部传递数值)
tvMenu.setTag(menuTextViews[i]);
//相当于在textview下设置<android:layoutWidth>和<android:layoutHeight>
tvMenu.setLayoutParams(new LayoutParams(layoutWidth / 4,30));
tvMenu.setPadding(30, 14, 30, 10);
tvMenu.setText(menuTextViews[i]);
tvMenu.setTextColor(Color.WHITE);
tvMenu.setGravity(Gravity.CENTER_HORIZONTAL);
tvMenu.setOnClickListener(SlideMenuOnClickListener); // 菜单项计数
menuUtil.count ++; // 设置第一个菜单项背景
if(menuUtil.count == 1){
tvMenu.setBackgroundResource(R.drawable.menu_bg);
} menuLinerLayout.addView(tvMenu,menuLinerLayoutParames);
menuList.add(tvMenu);
} return menuLinerLayout;
} // 单个菜单事件,第一更改对应菜单项的背景图片,另一方面将内容布局的内容更改为菜单项对应的布局
OnClickListener SlideMenuOnClickListener = new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
String menuTag = v.getTag().toString(); if(v.isClickable()){
textView = (TextView)v;
Log.i("SlideMenu",
"width:" + textView.getWidth() +
"height:" + textView.getHeight()); textView.setBackgroundResource(R.drawable.menu_bg); for(int i = 0;i < menuList.size();i++){
if(!menuTag.equals(menuList.get(i).getText())){
menuList.get(i).setBackgroundDrawable(null);
}
} // 点击菜单时改变内容
slideMenuOnChange(menuTag);
}
}
}; // 点击时改内容,就是首先将内容布局对应的控件全部删除,然后添加需要展现的控件即可
private void slideMenuOnChange(String menuTag){
LayoutInflater inflater = activity.getLayoutInflater();
//下面的内容页面
ViewGroup llc = (ViewGroup)activity.findViewById(R.id.linearLayoutContent);
llc.removeAllViews();
if(menuTag.equals(SlideMenuUtil.ITEM_MOBILE)){
llc.addView(inflater.inflate(R.layout.item_mobile, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_WEB)){
llc.addView(inflater.inflate(R.layout.item_web, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_CLOUD)){
llc.addView(inflater.inflate(R.layout.item_cloud, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_DATABASE)){
llc.addView(inflater.inflate(R.layout.item_database, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_EMBED)){
llc.addView(inflater.inflate(R.layout.item_embed, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_SERVER)){
llc.addView(inflater.inflate(R.layout.item_server, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_DOTNET)){
llc.addView(inflater.inflate(R.layout.item_dotnet, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_JAVA)){
llc.addView(inflater.inflate(R.layout.item_java, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_SAFE)){
llc.addView(inflater.inflate(R.layout.item_safe, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_DOMAIN)){
llc.addView(inflater.inflate(R.layout.item_domain, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_RESEASRCH)){
llc.addView(inflater.inflate(R.layout.item_research, null));
}else if(menuTag.equals(SlideMenuUtil.ITEM_MANAGE)){
llc.addView(inflater.inflate(R.layout.item_manage, null));
}
}
}
这样,在viewpager所在的activity,仅仅需要调用getSlideMenuLinerLayout(String[] menuTextViews,int layoutWidth)方法即可,并在这里处理页面滚动事件
package com.slide.menu; import java.util.ArrayList; import com.slide.util.SlideMenuUtil; import android.app.Activity;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; /**
* Android实现导航菜单左右滑动效果
*
* @Description: Android实现导航菜单左右滑动效果
*
* @FileName: SlideMenuActivity.java
*
* @Package com.slide.menu
*
* @Author Hanyonglu
*
* @Date 2012-4-20 上午09:15:11
*
* @Version V1.0
*/
public class SlideMenuActivity extends Activity {
/** Called when the activity is first created. */
private String[][] menus = {
{ SlideMenuUtil.ITEM_MOBILE, SlideMenuUtil.ITEM_WEB,
SlideMenuUtil.ITEM_CLOUD, SlideMenuUtil.ITEM_DATABASE },
{ SlideMenuUtil.ITEM_EMBED, SlideMenuUtil.ITEM_SERVER,
SlideMenuUtil.ITEM_DOTNET, SlideMenuUtil.ITEM_JAVA },
{ SlideMenuUtil.ITEM_SAFE, SlideMenuUtil.ITEM_DOMAIN,
SlideMenuUtil.ITEM_RESEASRCH, SlideMenuUtil.ITEM_MANAGE } }; // 当前ViewPager索引
private int pagerIndex = 0;
private ArrayList<View> menuViews = null; private ViewGroup main = null;
private ViewPager viewPager = null;
// 左右导航图片按钮
private ImageView imagePrevious = null;
private ImageView imageNext = null; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置无标题窗口
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 取得窗口属性
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
// 窗口的宽度
int screenWidth = dm.widthPixels; LayoutInflater inflater = getLayoutInflater();
menuViews = new ArrayList<View>();
SlideMenuLayout menu = new SlideMenuLayout(this); for (int i = 0; i < menus.length; i++) {
// menuViews为一个集合,arrayList<View>
menuViews.add(menu.getSlideMenuLinerLayout(menus[i], screenWidth));
} main = (ViewGroup) inflater.inflate(R.layout.main, null); setContentView(main);
// 左右导航图片按钮
imagePrevious = (ImageView) findViewById(R.id.ivPreviousButton);
imageNext = (ImageView) findViewById(R.id.ivNextButton);
imagePrevious.setOnClickListener(new ImagePreviousOnclickListener());
imageNext.setOnClickListener(new ImageNextOnclickListener()); if (menuViews.size() > 1) {
imageNext.setVisibility(View.VISIBLE);
} // 菜单背景
// imageMenuBack = (ImageView)findViewById(R.id.ivMenuBackground);
// imageMenuBack.setVisibility(View.INVISIBLE); // 加载移动菜单下内容,llc为主体部分的布局
ViewGroup llc = (ViewGroup) findViewById(R.id.linearLayoutContent);
llc.addView(inflater.inflate(R.layout.item_mobile, null)); viewPager = (ViewPager) main.findViewById(R.id.slideMenu);
viewPager.setAdapter(new SlideMenuAdapter());
viewPager.setOnPageChangeListener(new SlideMenuChangeListener());
} // 滑动菜单数据适配器
class SlideMenuAdapter extends PagerAdapter { @Override
public int getCount() {
// View v =
// menuViews.get(0).findViewWithTag(SlideMenuUtil.ITEM_MOBILE);
// v.setBackgroundResource(R.drawable.menu_bg);
return menuViews.size();
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
} @Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return super.getItemPosition(object);
} @Override
public void destroyItem(View arg0, int arg1, Object arg2) {
// TODO Auto-generated method stub
((ViewPager) arg0).removeView(menuViews.get(arg1));
} @Override
public Object instantiateItem(View arg0, int arg1) {
// TODO Auto-generated method stub
((ViewPager) arg0).addView(menuViews.get(arg1)); return menuViews.get(arg1);
} @Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
// TODO Auto-generated method stub } @Override
public Parcelable saveState() {
// TODO Auto-generated method stub
return null;
} @Override
public void startUpdate(View arg0) {
// TODO Auto-generated method stub } @Override
public void finishUpdate(View arg0) {
// TODO Auto-generated method stub }
} // 滑动菜单更改事件监听器
class SlideMenuChangeListener implements OnPageChangeListener { @Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub } @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub } @Override
public void onPageSelected(int arg0) {
//agr0代表现在显示的是viewpager的第几个页面
int pageCount = menuViews.size() - 1;
pagerIndex = arg0; // 显示右边导航图片
if (arg0 >= 0 && arg0 < pageCount) {
imageNext.setVisibility(View.VISIBLE);
} else {
imageNext.setVisibility(View.INVISIBLE);
} // 显示左边导航图片
if (arg0 > 0 && arg0 <= pageCount) {
imagePrevious.setVisibility(View.VISIBLE);
} else {
imagePrevious.setVisibility(View.INVISIBLE);
}
}
} // 右导航图片按钮事件
class ImageNextOnclickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
pagerIndex++;
viewPager.setCurrentItem(pagerIndex);
}
} // 左导航图片按钮事件
class ImagePreviousOnclickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
pagerIndex--;
viewPager.setCurrentItem(pagerIndex);
}
}
}
2,底部菜单栏两种方式实现
3,fragment的用法
android UI设计及开发的更多相关文章
- 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面
[Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...
- 【转】【Android UI设计与开发】之详解ActionBar的使用,androidactionbar
原文网址:http://www.bkjia.com/Androidjc/895966.html [Android UI设计与开发]之详解ActionBar的使用,androidactionbar 详解 ...
- 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面
本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗? 最下方有源码的下载 ...
- 【Android UI设计与开发】第01期:引导界面(一)ViewPager介绍和使用详解
做Android开发加起来差不多也有一年多的时间了,总是想写点自己在开发中的心得体会与大家一起交流分享.共同进步,刚开始写也不知该如何下手,仔细想了一下,既然是刚开始写,那就从一个软件给人最直观的感受 ...
- 【Android UI设计与开发】4.底部菜单栏(一)Fragment介绍和简单实现
TabActivity在Android4.0以后已经被完全弃用,取而代之的是Fragment.Fragment是Android3.0新增的概念,Fragment翻译成中文是碎片的意思,不过却和Acti ...
- 【Android UI设计与开发】8.顶部标题栏(一)ActionBar 奥义·详解
一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和men ...
- 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...
- 【Android UI设计和开发】动画(Animation)详细说明(一)
Android开发之动画效果浅析 请尊重他人的劳动成果.转载请注明出处:Android开发之动画效果浅析 程序执行效果图: Android动画主要包括补间动画(Tween)View Animation ...
- 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面
这一篇我将会以人人网的引导界面为实例来展开详细的讲解,人人网的引导界面比较的新颖,不同于其他应用程序千篇一律的靠滑动来引导用户,而是以一个一个比较生动形象的动画效果展示在用户们的面前,有一种给人眼前一 ...
- 【Android UI设计与开发】8.顶部标题栏(一)ActionBar 奥义·详解
一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和men ...
随机推荐
- 手写数字识别 卷积神经网络 Pytorch框架实现
MNIST 手写数字识别 卷积神经网络 Pytorch框架 谨此纪念刚入门的我在卷积神经网络上面的摸爬滚打 说明 下面代码是使用pytorch来实现的LeNet,可以正常运行测试,自己添加了一些注释, ...
- CSP-S 2019游记
Day 0 下午到了广州,酒店还不错,不好的是附近没有什么吃饭的地方 zyd和ljz巨神说如果上了450就女装. 晚上看了一下写过模板,本来准备敲几个新模板的的结果被卡常,心态没了.于是又把wys的卡 ...
- 【优质blog、网址】置顶
一.大公司等技术blog: blog1: http://blog.csdn.net/mfcing/article/details/51577173 blog2: http://blog.csdn. ...
- C++ 内联函数 inline关键字
inline 关键字主要功能是为了 代替掉 宏代码片段. 在C++中使用关键字inline关键字声明内联函数. inline int fun(int a,int b) { return a < ...
- NlData初学者开发篇(ORM)
一, 简介:NlData是一个个人开发的ORM,为了学习而学习,是基于表达式实现的一个ORM 二,先简单介绍使用,如下,配置是统一接口 NlClient client = new NlClient(n ...
- linux复习4:文件和目录
7一.linux文件 1.linux文件的扩展名:文件扩展名是文件名最后一个点之后的部分,下面列出了其中一部分 (1)压缩文件和归档文件 压缩和归档的文件扩展名及其含义如下. .bz2:使用bzip2 ...
- javaScript运动框架之匀速运动
运动框架 1.在开始运动时,关闭已有定时器 2.把运动和停止隔开(if/else) 匀速运动的停止条件 运动终止条件:距离足够近 Demo代码 <!DOCTYPE html> <ht ...
- 有准备的面试才能拿到更好的 Offer
http://www.sohu.com/a/331411917_181657 前几天有读者问我,工作不顺利辞职了.本来以为凭借自己的能力和工作经验可以轻松找到更好的工作,结果投了简历,约面试的很少,面 ...
- String与C风格字符串转换
String字符串转换为C风格字符串需要利用string类的成员函数c_str().而C风格字符串转换转换为string字符串可以直接利用运算符=.首先介绍c_str()函数原型: const val ...
- Arm宣布将在Linux中应用事务内存扩展支持
事务内存扩展是Arm对硬件事务内存的支持,用于改进对大型共享数据结构的并发访问. 在宣布事务性内存扩展和可伸缩向量扩展2时,Arm表示他们将很快为GNU工具链和LLVM提供支持.正如我们已经看到的,为 ...