android 顶部横向滑动菜单效果

顶部横向滑动菜单效果

博客分类:

 

android进阶

android 

这个是在在别人的基础上改的(基本上没改),我就不重造轮子了。 
26090920_Pe23.png 
先是自定义的横向ScollView,用Adapter模式填充数据 

Java代码  收藏代码

  1. import com.example.demo.R;  

  2.   

  3. import android.content.Context;  

  4. import android.database.DataSetObserver;  

  5. import android.util.AttributeSet;  

  6. import android.util.SparseArray;  

  7. import android.view.Gravity;  

  8. import android.view.LayoutInflater;  

  9. import android.view.View;  

  10. import android.view.View.OnClickListener;  

  11. import android.view.animation.AccelerateDecelerateInterpolator;  

  12. import android.view.animation.Animation;  

  13. import android.view.animation.AnimationSet;  

  14. import android.view.animation.ScaleAnimation;  

  15. import android.view.animation.TranslateAnimation;  

  16. import android.widget.BaseAdapter;  

  17. import android.widget.FrameLayout;  

  18. import android.widget.HorizontalScrollView;  

  19. import android.widget.ImageView;  

  20. import android.widget.LinearLayout;  

  21. import android.widget.TextView;  

  22.   

  23. public class NavigationHorizontalScrollView extends HorizontalScrollView implements OnClickListener {  

  24.   

  25.     public NavigationHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) {  

  26.         super(context, attrs, defStyle);  

  27.         init();  

  28.     }  

  29.   

  30.     public NavigationHorizontalScrollView(Context context, AttributeSet attrs) {  

  31.         super(context, attrs);  

  32.         init();  

  33.     }  

  34.   

  35.     public NavigationHorizontalScrollView(Context context) {  

  36.         super(context);  

  37.         init();  

  38.     }  

  39.   

  40.     private FrameLayout mFrameLayout;  

  41.     private BaseAdapter mBaseAdapter;  

  42.     private SparseArray<View> mSparseArray;  

  43.     private int oldPosition;  

  44.     private TextView backView;  

  45.     private ImageView preImage, nextImage;  

  46.   

  47.     @Override  

  48.     protected void onScrollChanged(int l, int t, int oldl, int oldt) {  

  49.         super.onScrollChanged(l, t, oldl, oldt);  

  50.         resetImageView();  

  51.     }  

  52.   

  53.     private void resetImageView() {  

  54.         /* 计算水平方向滚动条的滑块的偏移值。 */  

  55.         int ScrollOffset = computeHorizontalScrollOffset();  

  56.         /* 滚动条长度 */  

  57.         int ScrollExtent = computeHorizontalScrollExtent();  

  58.         /* 滚动条当前位置 */  

  59.         int curScrollLoc = ScrollOffset + ScrollExtent;  

  60.         /* scrollView 的可滚动水平范围是所有子视图的宽度总合。 */  

  61.         int ScrollRange = computeHorizontalScrollRange();  

  62.   

  63.         /* 如果当前位置 在ScrollExtent 和 ScrollRange 之间,左右两边的View都显示 */  

  64.         if (curScrollLoc > ScrollExtent && curScrollLoc < ScrollRange) {  

  65.             if (preImage != null)  

  66.                 preImage.setVisibility(View.VISIBLE);  

  67.             if (nextImage != null)  

  68.                 nextImage.setVisibility(View.VISIBLE);  

  69.             return;  

  70.         }  

  71.         /* 如果滚动到最左边 */  

  72.         if (curScrollLoc == ScrollExtent) {  

  73.             if (preImage != null)  

  74.                 preImage.setVisibility(View.INVISIBLE);  

  75.             return;  

  76.         }  

  77.         /* 如果滚动到最右边 */  

  78.         if (curScrollLoc >= ScrollRange) {  

  79.             if (nextImage != null)  

  80.                 nextImage.setVisibility(View.INVISIBLE);  

  81.             return;  

  82.         }  

  83.   

  84.     }  

  85.   

  86.     private void init() {  

  87.         mFrameLayout = new FrameLayout(getContext());  

  88.         mFrameLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));  

  89.         addView(mFrameLayout);  

  90.         mSparseArray = new SparseArray<View>();  

  91.     }  

  92.   

  93.     private void buildItemView() {  

  94.         if (mBaseAdapter == null)  

  95.             return;  

  96.         LinearLayout linearLayout = new LinearLayout(getContext());  

  97.         for (int i = 0; i < mBaseAdapter.getCount(); i++) {  

  98.             View view = mBaseAdapter.getView(i, mSparseArray.get(i), this);  

  99.             view.setOnClickListener(this);  

  100.             mSparseArray.put(i, view);  

  101.             linearLayout.addView(mSparseArray.get(i));  

  102.         }  

  103.         LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,  

  104.                 LinearLayout.LayoutParams.FILL_PARENT);  

  105.         layoutParams.gravity = Gravity.CENTER_VERTICAL;  

  106.         backView = (TextView) LayoutInflater.from(getContext()).inflate(R.layout.navigation_item, null);  

  107.         backView.setBackgroundResource(R.drawable.bg_view);  

  108.         backView.setPadding(0505);  

  109.         mFrameLayout.addView(backView, layoutParams);  

  110.         mFrameLayout.addView(linearLayout);  

  111.     }  

  112.   

  113.     public void setAdapter(BaseAdapter baseAdapter) {  

  114.         if (baseAdapter == null)  

  115.             return;  

  116.         mBaseAdapter = baseAdapter;  

  117.         mBaseAdapter.registerDataSetObserver(new DataSetObserver() {  

  118.             @Override  

  119.             public void onChanged() {  

  120.                 oldPosition = 0;  

  121.                 buildItemView();  

  122.                 super.onChanged();  

  123.             }  

  124.         });  

  125.         mBaseAdapter.notifyDataSetChanged();  

  126.     }  

  127.   

  128.     @Override  

  129.     public void onClick(View v) {  

  130.         if (v.getId() == preImage.getId()) {  

  131.             fling(-800);  

  132.             return;  

  133.         }  

  134.         if (v.getId() == nextImage.getId()) {  

  135.             fling(800);  

  136.             return;  

  137.         }  

  138.         if (onItemClickListener != null) {  

  139.             int position = mSparseArray.indexOfValue(v);  

  140.             startAnimation(position);  

  141.             oldPosition = position;  

  142.             onItemClickListener.click(position);  

  143.         }  

  144.     }  

  145.   

  146.     private void startAnimation(int position) {  

  147.         AnimationSet animationSet = new AnimationSet(true);  

  148.         animationSet.addAnimation(buildScaleAnimation(oldPosition, position));  

  149.         animationSet.addAnimation(buildTranslateAnimation(oldPosition, position));  

  150.         animationSet.setInterpolator(new AccelerateDecelerateInterpolator());  

  151.         /* 移动后不复原,不返回动画前的状态位置 */  

  152.         animationSet.setFillAfter(true);  

  153.         animationSet.setDuration(500);  

  154.         backView.startAnimation(animationSet);  

  155.         invalidate();  

  156.     }  

  157.   

  158.     private Animation buildScaleAnimation(int oldPosition, int position) {  

  159.         float oldWidth = getItemView(oldPosition).getWidth();  

  160.         float newWidth = getItemView(position).getWidth();  

  161.         float fromX = oldWidth / backView.getWidth();  

  162.         float toX = newWidth / backView.getWidth();  

  163.         ScaleAnimation animation = new ScaleAnimation(fromX, toX, 1f, 1f, Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE,  

  164.                 0.0f);  

  165.         return animation;  

  166.     }  

  167.   

  168.     private Animation buildTranslateAnimation(int oldPosition, int position) {  

  169.         TranslateAnimation animation = new TranslateAnimation(getItemView(oldPosition).getLeft(), getItemView(position)  

  170.                 .getLeft(), 00);  

  171.         return animation;  

  172.     }  

  173.   

  174.     private View getItemView(int position) {  

  175.         return mSparseArray.get(position);  

  176.     }  

  177.   

  178.     public interface OnItemClickListener {  

  179.         void click(int position);  

  180.     }  

  181.   

  182.     private OnItemClickListener onItemClickListener;  

  183.   

  184.     public void setOnItemClickListener(OnItemClickListener onItemClickListener) {  

  185.         this.onItemClickListener = onItemClickListener;  

  186.     }  

  187.   

  188.     public void setImageView(ImageView preImage, ImageView nextImage) {  

  189.         this.preImage = preImage;  

  190.         this.nextImage = nextImage;  

  191.         if (preImage != null) {  

  192.             preImage.setOnClickListener(this);  

  193.         }  

  194.         if (nextImage != null) {  

  195.             nextImage.setOnClickListener(this);  

  196.         }  

  197.     }  

  198.   

  199. }  



用法: 

Java代码  收藏代码

  1. import java.util.ArrayList;  

  2. import java.util.List;  

  3.   

  4. import android.app.Activity;  

  5. import android.content.Context;  

  6. import android.os.Bundle;  

  7. import android.view.LayoutInflater;  

  8. import android.view.View;  

  9. import android.view.ViewGroup;  

  10. import android.widget.BaseAdapter;  

  11. import android.widget.ImageView;  

  12. import android.widget.TextView;  

  13.   

  14. import com.example.demo.model.Navigation;  

  15. import com.example.demo.widget.NavigationHorizontalScrollView;  

  16.   

  17. public class MainActivity extends Activity{  

  18.           

  19.     private Context context;  

  20.     private List<Navigation> navs = buildNavigation();  

  21.     private NavigationHorizontalScrollView mHorizontalScrollView;  

  22.     private TextView tv;  

  23.     @Override  

  24.     public void onCreate(Bundle savedInstanceState) {  

  25.         super.onCreate(savedInstanceState);  

  26.         setContentView(R.layout.activity_main);  

  27.         context=this;  

  28.         tv=(TextView)findViewById(R.id.tv);  

  29.         tv.setText("You clicked "+navs.get(0).getTitle());  

  30.           

  31.         mHorizontalScrollView=(NavigationHorizontalScrollView)findViewById(R.id.horizontal_scrollview);  

  32.         mHorizontalScrollView.setImageView((ImageView) findViewById(R.id.iv_pre),(ImageView) findViewById(R.id.iv_next));  

  33.                   

  34.         mHorizontalScrollView.setOnItemClickListener(new NavigationHorizontalScrollView.OnItemClickListener() {  

  35.               

  36.             @Override  

  37.             public void click(int position) {  

  38.                 // TODO Auto-generated method stub  

  39.                 tv.setText("You clicked "+navs.get(position).getTitle());  

  40.             }  

  41.         });  

  42.           

  43.         mHorizontalScrollView.setAdapter(new NavigationAdapter());  

  44.           

  45.     }  

  46.   

  47.     private List<Navigation> buildNavigation() {  

  48.         List<Navigation> navigations = new ArrayList<Navigation>();  

  49.         navigations.add(new Navigation(0"url""首页"));  

  50.         navigations.add(new Navigation(1"url""新闻"));  

  51.         navigations.add(new Navigation(2"url""科技"));  

  52.         navigations.add(new Navigation(3"url""设置"));  

  53.         navigations.add(new Navigation(4"url""朋友"));  

  54.         navigations.add(new Navigation(5"url""测试长标题"));  

  55.         navigations.add(new Navigation(7"url""测试"));  

  56.         navigations.add(new Navigation(6"url""我的宝贝"));  

  57.         return navigations;  

  58.     }  

  59.   

  60.       

  61.     class NavigationAdapter extends BaseAdapter {  

  62.   

  63.         @Override  

  64.         public int getCount() {  

  65.             return navs.size();  

  66.         }  

  67.   

  68.         @Override  

  69.         public Object getItem(int position) {  

  70.             return navs.get(position);  

  71.         }  

  72.   

  73.         @Override  

  74.         public long getItemId(int position) {  

  75.             return position;  

  76.         }  

  77.   

  78.         @Override  

  79.         public View getView(int position, View convertView, ViewGroup parent) {  

  80.             if (convertView == null) {  

  81.                 convertView = LayoutInflater.from(context).inflate(R.layout.navigation_item, null);  

  82.             }  

  83.             ((TextView) convertView).setText(navs.get(position).getTitle());  

  84.             return convertView;  

  85.         }  

  86.   

  87.     }  

  88.       

  89. }  


布局: 

Xml代码  收藏代码

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

  2.     android:layout_width="match_parent"  

  3.     android:layout_height="match_parent"  

  4.     android:orientation="vertical" >  

  5.   

  6.     <LinearLayout  

  7.     android:layout_width="match_parent"  

  8.     android:layout_height="wrap_content"  

  9.     android:orientation="horizontal"  

  10.     >  

  11.   

  12.     <ImageView  

  13.         android:id="@+id/iv_pre"  

  14.         android:layout_width="30dip"  

  15.         android:layout_height="30dip"  

  16.         android:layout_gravity="center_vertical"  

  17.         android:src="@drawable/ic_pre" />  

  18.   

  19.     <com.example.demo.widget.NavigationHorizontalScrollView  

  20.         android:id="@+id/horizontal_scrollview"  

  21.         android:layout_width="wrap_content"  

  22.         android:layout_height="wrap_content"  

  23.         android:layout_gravity="center_vertical"  

  24.         android:layout_weight="1"  

  25.         android:paddingBottom="2dip"  

  26.         android:paddingTop="2dip"  

  27.         android:scrollbars="none" />  

  28.   

  29.     <ImageView  

  30.         android:id="@+id/iv_next"  

  31.         android:layout_width="30dip"  

  32.         android:layout_height="30dip"  

  33.         android:layout_gravity="center_vertical"  

  34.         android:src="@drawable/ic_next" />  

  35.   

  36.     </LinearLayout>  

  37.     <FrameLayout  

  38.         android:layout_width="fill_parent"  

  39.         android:layout_height="fill_parent" >  

  40.         <TextView   

  41.             android:id="@+id/tv"  

  42.             android:layout_width="wrap_content"  

  43.             android:layout_height="wrap_content"  

  44.             android:textColor="@android:color/black"  

  45.             android:textSize="24sp"  

  46.             android:layout_gravity="center"  

  47.             />  

  48.     </FrameLayout>  

  49.   

  50. </LinearLayout>  



具体看附件


转载于:https://my.oschina.net/u/2263251/blog/470976

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PC端横向滑动效果切换菜单是指在计算机上使用鼠标或键盘进行操作时,通过横向滑动的方式切换不同的菜单页面。 横向滑动效果切换菜单可以增加用户界面的互动性和美观性,让用户在浏览网页时更加方便快捷地切换不同菜单。通常情况下,使用横向滑动功能切换菜单需要满足以下几个条件: 1. 导航菜单支持横向排列:为了实现横向滑动切换菜单菜单栏需要支持横向排列,这样用户才能够通过滑动手势移动到不同的菜单选项上。 2. 滑动功能的实现:使用横向滑动切换菜单时,需要通过鼠标或键盘等设备的操作来模拟滑动手势。例如,可以使用鼠标的拖拽或滚动功能,或者使用键盘的左右箭头键来实现滑动切换。 3. 切换菜单页面的动画效果:为了增加用户体验,切换菜单时可以添加动画效果,让切换过程更加平滑和自然,使用户感知到页面的切换。 4. 菜单标识或导航指示:为了让用户知道当前所处的菜单位置,可以在菜单栏添加标识或导航指示,如高亮显示当前选中的菜单项,或在页面上方显示当前菜单位置的标题等。 总的来说,PC端横向滑动效果切换菜单通过横向排列菜单项并利用滑动手势来切换不同的菜单页面,可以提升用户的界面交互性和使用体验。这种切换方式在许多网页设计中经常使用,使用户能够更加方便地浏览不同的内容和功能模块。 ### 回答2: PC端横向滑动效果是一种常见的切换菜单的方式,它可以提供更流畅、直观的用户体验。在实现横向滑动效果切换菜单的过程中,我们可以采用以下几个步骤: 1. 设计页面结构:首先,我们需要根据需求设计页面的基本结构,确定好菜单的布局方式和样式。可以使用HTML和CSS进行布局,并使用JavaScript来实现交互效果。 2. 添加触摸和滑动事件监听器:在JavaScript代码中,我们可以添加事件监听器,用于监控用户的触摸和滑动行为。通过监听用户的手势动作,我们可以捕获到用户的滑动方向和距离。 3. 根据滑动方向进行切换:根据捕获到的滑动方向和距离,我们可以根据需求决定如何切换菜单。例如,如果用户向左滑动一定距离,我们可以切换到下一个菜单;如果用户向右滑动一定距离,我们可以切换到上一个菜单。 4. 添加滑动动画效果:为了给用户更好的视觉体验,我们可以在切换菜单时添加一些滑动动画效果。通过改变菜单的位置和透明度等属性,可以实现平滑的切换效果。 5. 响应式设计:在实现PC端横向滑动效果切换菜单时,还需要考虑到响应式设计的问题。我们可以通过媒体查询和适当的CSS样式调整,使菜单在不同的屏幕尺寸下有更好的适配效果。 总的来说,PC端横向滑动效果切换菜单可以通过监听用户的滑动行为,结合动画效果实现平滑的菜单切换。这样可以提升用户的交互体验,使网页更加吸引人。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值