- 浏览: 5819565 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
一切为了快速迭代!
自定义属性:
两个点:
不使用上面的类。
快速的使用方法:
伪代码
CircleIndicator
https://github.com/THEONE10211024/CircleIndicator
import android.content.Context; import android.content.res.TypedArray; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.Gravity; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import java.lang.reflect.Field; /** * Created by liangfei on 3/26/15. */ public class CirclePageIndicator extends LinearLayout implements ViewPager.OnPageChangeListener { public static final int INDICATOR_TYPE_CIRCLE = 0; public static final int INDICATOR_TYPE_FRACTION = 1; public enum IndicatorType { CIRCLE(INDICATOR_TYPE_CIRCLE), FRACTION(INDICATOR_TYPE_FRACTION), UNKNOWN(-1); private int type; IndicatorType(int type) { this.type = type; } public static IndicatorType of(int value) { switch (value) { case INDICATOR_TYPE_CIRCLE: return CIRCLE; case INDICATOR_TYPE_FRACTION: return FRACTION; default: return UNKNOWN; } } } public static final int DEFAULT_INDICATOR_SPACING = 5; private int mActivePosition = -1; private int mIndicatorSpacing; private boolean mIndicatorTypeChanged = false; private IndicatorType mIndicatorType = IndicatorType.of(INDICATOR_TYPE_CIRCLE); private ViewPager mViewPager; private ViewPager.OnPageChangeListener mUserDefinedPageChangeListener; public CirclePageIndicator(Context context) { this(context, null); } public CirclePageIndicator(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CirclePageIndicator(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.CirclePageIndicator, 0, 0); try { mIndicatorSpacing = a.getDimensionPixelSize( R.styleable.CirclePageIndicator_indicator_spacing, DEFAULT_INDICATOR_SPACING); int indicatorTypeValue = a.getInt( R.styleable.CirclePageIndicator_indicator_type, mIndicatorType.type); mIndicatorType = IndicatorType.of(indicatorTypeValue); } finally { a.recycle(); } init(); } private void init() { setOrientation(HORIZONTAL); if (!(getLayoutParams() instanceof FrameLayout.LayoutParams)) { FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); params.gravity = Gravity.BOTTOM | Gravity.START; setLayoutParams(params); } } public void setViewPager(ViewPager pager) { mViewPager = pager; mUserDefinedPageChangeListener = getOnPageChangeListener(pager); pager.setOnPageChangeListener(this); setIndicatorType(mIndicatorType); } public void setIndicatorType(IndicatorType indicatorType) { mIndicatorType = indicatorType; mIndicatorTypeChanged = true; if (mViewPager != null) { addIndicator(mViewPager.getAdapter().getCount()); } } private void removeIndicator() { removeAllViews(); } private void addIndicator(int count) { removeIndicator(); if (count <= 0) return; if (mIndicatorType == IndicatorType.CIRCLE) { for (int i = 0; i < count; i++) { ImageView img = new ImageView(getContext()); LayoutParams params = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.leftMargin = mIndicatorSpacing; params.rightMargin = mIndicatorSpacing; img.setImageResource(R.drawable.circle_indicator_stroke); addView(img, params); } } else if (mIndicatorType == IndicatorType.FRACTION) { TextView textView = new TextView(getContext()); textView.setTag(count); LayoutParams params = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); addView(textView, params); } updateIndicator(mViewPager.getCurrentItem()); } private void updateIndicator(int position) { if (mIndicatorTypeChanged || mActivePosition != position) { mIndicatorTypeChanged = false; if (mIndicatorType == IndicatorType.CIRCLE) { ((ImageView) getChildAt(mActivePosition)) .setImageResource(R.drawable.circle_indicator_stroke); ((ImageView) getChildAt(position)) .setImageResource(R.drawable.circle_indicator_solid); } else if (mIndicatorType == IndicatorType.FRACTION) { TextView textView = (TextView) getChildAt(0); //noinspection RedundantCast textView.setText(String.format("%d/%d", position + 1, (int) textView.getTag())); } mActivePosition = position; } } private ViewPager.OnPageChangeListener getOnPageChangeListener(ViewPager pager) { try { Field f = pager.getClass().getDeclaredField("mOnPageChangeListener"); f.setAccessible(true); return (ViewPager.OnPageChangeListener) f.get(pager); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (mUserDefinedPageChangeListener != null) { mUserDefinedPageChangeListener.onPageScrolled(position, positionOffset, positionOffsetPixels); } } @Override public void onPageSelected(int position) { updateIndicator(position); if (mUserDefinedPageChangeListener != null) { mUserDefinedPageChangeListener.onPageSelected(position); } } @Override public void onPageScrollStateChanged(int state) { if (mUserDefinedPageChangeListener != null) { mUserDefinedPageChangeListener.onPageScrollStateChanged(state); } } }
自定义属性:
<resources> <declare-styleable name="CirclePageIndicator"> <attr name="indicator_spacing" format="dimension" /> <attr name="indicator_type" format="enum"> <enum name="circle" value="0" /> <enum name="fraction" value="1" /> </attr> </declare-styleable> </resources>
两个点:
不使用上面的类。
快速的使用方法:
伪代码
private ViewPager viewPager; private LinearLayout indicators; private ArrayList<View> listViews = new ArrayList<View>(); private int curPagerPosition=0,oldPagerPosition=0; ....... viewPager=(ViewPager)findViewById(R.id.viewPager); indicators=(LinearLayout)findViewById(R.id.indicators); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { // TODO Auto-generated method stub indicators.getChildAt(oldPagerPosition).setBackgroundResource(R.drawable.img_detail_dot_normal); indicators.getChildAt(position).setBackgroundResource(R.drawable.img_detail_dot_selected); oldPagerPosition=position; } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } });
indicators.removeAllViews(); LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.leftMargin=10; params.rightMargin=10; List<ProductImgEntity> imgs=curProductDetailInfo.getImgs(); if(curProductDetailInfo.getImgs()==null){ showToast(R.string.alert_data_incomplete); return; } int size=imgs.size(); for(int i=0;i<size;i++){ View view=LayoutInflater.from(context).inflate(R.layout.item_product_img, null); ImageView item_0=(ImageView)view.findViewById(R.id.item_0); Commands.loadImageByVolley(curProductDetailInfo.getImgs().get(i).getImgUrl(),item_0,R.drawable.default_img,400,400); listViews.add(view); ImageView child=new ImageView(context); child.setLayoutParams(params); child.setBackgroundResource(i==curPagerPosition?R.drawable.img_detail_dot_selected:R.drawable.img_detail_dot_normal); indicators.addView(child); } viewPager.setAdapter(new MyPagerAdapter(listViews));
CircleIndicator
https://github.com/THEONE10211024/CircleIndicator
发表评论
-
工具类之FragmentUtils
2017-04-01 11:37 1723fragment应该是广大Android开发者都用到过的一个v ... -
左中右结构的行布局
2016-12-19 21:35 1184最近项目要开发一个新版本,发现项目中许多布局大致都相同改动不大 ... -
RecyclerView:带header&footer&加载更多
2015-09-09 16:24 2966接上一篇 由简到繁,循序渐进 实现了: 0,点击&长按 ... -
RecyclerView:带header和footer的grid
2015-09-09 13:47 3044知道原理后,为RecyclerView实现同时带header和 ... -
RecyclerView:带header的grid
2015-09-09 13:01 2430RecyclerView是一个高度可定制性的View 本文将使 ... -
iconify使用文本替换icon测试
2015-08-28 17:12 1690源项目地址 https://github.com/JoanZa ... -
快速上传头像到服务端工具类FaceUtil
2015-07-12 14:22 3076快速迭代用 import java.io.DataOut ... -
HorizontalScrollView+RadioGroup+ViewPager+FragmentPagerAdapter基本结构
2015-07-12 13:56 3294快速迭代用 import java.util.Arr ... -
LoadMoreListView+SwipeRefreshLayout(分页下拉)基本结构
2015-07-12 13:07 4154一切为了快速迭代 import java.util. ... -
RadioButton+ViewPager+FragmentPagerAdapter快速搭建页面结构
2015-07-12 11:08 2562一切为了快速开发 开发类似界面 import and ... -
简单实现可以多选的ProductListDialog<T>
2015-06-25 22:33 1256只是一个范例,是为了代码快速迭代而写的 使用了listView ... -
基于上一篇写的SimplePairListPopupWindow<F,S>
2015-06-19 11:15 1536这次使用Pair<F,S>实现一个简单的Simpl ... -
基于上一篇实现的SimpleListPopupWindow<T>
2015-06-19 11:11 1517这次是个简单的PopupWindow,快速迭代用。 imp ... -
实现一个快速简单的SimpleListDialog<T>
2015-06-19 10:59 1745我写这样的文章都是为了快速迭代,所以都写的比较简单,谅解 此 ... -
为ViewPager设置SimpleViewPagerIndicator
2015-02-14 13:45 4725说到ViewPagerIndicator,网上有很多专门的开源 ... -
一个典型的从下部弹上来的Dialog
2014-12-05 14:47 6071典型的看图 import android.app ...
相关推荐
2. 主Activity或Fragment,其中设置了ViewPager和小圆点指示器,并关联了适配器。 3. 小圆点指示器的布局文件,可能包含一个LinearLayout或RelativeLayout,里面包含了多个ImageView或自定义的圆形View。 4. 监听...
而Indicator则是用来指示当前ViewPager中所显示页面的一种可视化元素,通常表现为小圆点或其他形状,用户可以通过观察Indicator了解当前浏览的是哪个页面以及总共有多少页面。本教程将详细介绍如何在Android项目中为...
在Activity或Fragment中,设置`CirclePageIndicator`与`ViewPager`关联: ```java CircleIndicator indicator = findViewById(R.id.indicator); indicator.setViewPager(viewPager); ``` 6. **同步指示器状态*...
标题中的“ViewPager底部带圆圈标识”指的是在Android开发中,使用ViewPager进行页面滑动时,在底部添加一种视觉指示器,通常表现为小圆点,用来显示当前页面在总页面中的位置。这种设计常见于许多应用的引导页或者...
2. CirclePageIndicator:这个指示器由Jake Wharton的ViewPagerIndicator库提供,它呈现为一系列连续的小圆点,当前页面对应的圆点会被高亮。使用CirclePageIndicator,你需要在布局文件中添加控件,然后在Activity...
5. **设置适配器**:在`MainActivity`或其他控制类中,获取`ViewPager`实例并设置适配器: ```java ViewPager viewPager = findViewById(R.id.view_pager); viewPager.setAdapter(new MyPagerAdapter...
`FragmentViewPager` 是 `ViewPager` 的一个扩展,专为处理 `Fragment` 页面而设计。本教程将深入探讨 `ViewPager` 和 `FragmentViewPager` 的基本用法。 ### 1. ViewPager简介 `ViewPager` 是 Android Support ...
3. **设置ViewPager**:在主Activity中,实例化ViewPager,并将其Adapter设置为我们之前创建的`GuidePagerAdapter`。记得在布局文件中添加ViewPager,并将其关联到Activity的XML布局中。 4. **数据绑定**:在`...
在本教程中,我们将深入探讨ViewPager的基本用法以及如何添加底部指示器小圆点。 首先,ViewPager的核心功能是展示一个可以左右滑动的页面序列。它通过适配器(PagerAdapter)来获取并展示数据。创建一个自定义的...
例如,当有三个页面时,可以绘制三个小圆点,当前页面的圆点颜色为选中状态。 2. 使用第三方库:有许多开源库,如`TabPageIndicator`(来自`ViewPagerIndicator`库)和`CirclePageIndicator`,它们提供了丰富的样式...
例如,`CirclePageIndicator`是一个常见的选择,它可以为每个页面显示一个小圆点,并突出显示当前页面的圆点。 `RSSIndicator`可能是一个自定义的指示器,专门设计用来显示RSS源的数量,或者是一个包含了RSS源数据...
本项目标题为"android仿新闻客户端图片轮播带小圆点",描述中提到这个实现具有简洁的代码和良好的用户交互体验,支持手动滑动和自动轮播无缝切换。 首先,我们要理解这个功能的核心技术点: 1. **ViewPager**:在...
在`onCreate()`或`onResume()`中设置`ViewPager`的`OnPageChangeListener`,并在`onPageSelected()`回调中更新指示器的状态。 4. 设置数据:在`PagerAdapter`中填充数据,可以是`Fragment`或者`View`,根据项目需求...
这个"特效_viewpager动画效果"主题涉及到如何为ViewPager添加各种动态视觉效果,以提升用户体验和应用的交互性。以下是对这个主题的详细解释: 1. ViewPager基本使用: ViewPager允许用户通过左右滑动来切换页面,...
最后,将PagerAdapter设置到ViewPager中,并添加一个页面切换完成后的回调,以便在用户浏览完所有引导页后跳转到主界面: ```java ViewPager viewPager = findViewById(R.id.view_pager); List<View> pages = new ...
为了提供更好的用户体验,可以为页面切换添加平滑的动画效果,如淡入淡出、滑动等,这可以通过在PagerAdapter中设置相应的动画实现。 7. **优化性能** 对于内容较多的ViewPager,确保使用ViewHolder模式避免频繁...
- 设置Adapter:在Activity或Fragment中,获取ViewPager实例,然后设置刚才创建的PagerAdapter。 - 添加指示器(可选):为了增强用户体验,通常会在引导页下方添加一个指示器,如小圆点,来显示当前页面的位置。...
1. **ViewPager的使用**:首先,需要在布局XML文件中添加ViewPager,并为其设置适配器。适配器通常是一个实现了`PagerAdapter`接口的自定义类,它负责提供要显示的页面内容。在这个案例中,适配器可能包含一个包含...
在Android开发中,ViewPager是一个非常常用的组件,它允许用户通过左右滑动来切换不同的页面,通常用于实现类似相册、应用设置等界面的平滑过渡。而“ViewPager指示器”则是与ViewPager配合使用的控件,它能显示当前...