




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】banner广告及viewpager的小圆点指示器
一、主界面packagecom.example.t;importandroid.app.Activity;importandroid.os.Bundle;importandroid.support.v4.view.ViewPager;importandroid.support.v4.view.ViewPager.OnPageChangeListener;publicclassMainActivityextendsActivityimplementsOnPageChangeListener{
privateCirclePageIndicatorindicator;
privateViewPagerviewpager;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
}
privatevoidinitview(){
viewpager=(ViewPager)findViewById(R.id.viewpager);
indicator=(CirclePageIndicator)findViewById(R.id.indicator);
indicator.setStrokeWidth(0);
indicator.setPageCircleColor(0xFFFFFFFF);
viewpager.setAdapter(newMyadapter(this));
indicator.setViewPager(viewpager);
indicator.setOnPageChangeListener(this);
}
@Override
publicvoidonPageScrollStateChanged(intarg0){
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageSelected(intarg0){
}}二、广告适配器packagecom.example.t;importandroid.content.Context;importandroid.support.v4.view.PagerAdapter;importandroid.support.v4.view.ViewPager.LayoutParams;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.ImageView;importandroid.widget.ImageView.ScaleType;publicclassMyadapterextendsPagerAdapter{
privateContextcontext;
privateint[]p_w_picpaths;
publicMyadapter(Contextcontext){
this.context=context;
p_w_picpaths=newint[]{R.drawable.default_img_mid,R.drawable.default_img_mid,R.drawable.default_img_mid};
}
@Override
publicintgetCount(){
returnp_w_picpaths.length;
}
//判断View和Object是否为同一个View
@Override
publicbooleanisViewFromObject(Viewview,Objectobject){
returnview==object;
}
//控制当某个View不需要的时候的回收处理
@Override
publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){
container.removeView((View)object);
}
//实例化Item:即得到每个View
@Override
publicObjectinstantiateItem(ViewGroupcontainer,intposition){
ImageViewiv=newImageView(context);
iv.setScaleType(ScaleType.CENTER_CROP);
android.view.ViewGroup.LayoutParamsparams=newandroid.view.ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
iv.setLayoutParams(params);
iv.setImageResource(p_w_picpaths[position]);
container.addView(iv);
returniv;
}}三、小圆点指示器packagecom.example.t;importstaticandroid.graphics.Paint.ANTI_ALIAS_FLAG;importstaticandroid.widget.LinearLayout.HORIZONTAL;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Paint;importandroid.graphics.Paint.Style;importandroid.os.Parcel;importandroid.os.Parcelable;importandroid.support.v4.view.MotionEventCompat;importandroid.support.v4.view.ViewConfigurationCompat;importandroid.support.v4.view.ViewPager;importandroid.support.v4.view.ViewPager.OnPageChangeListener;importandroid.util.AttributeSet;importandroid.view.MotionEvent;importandroid.view.View;importandroid.view.ViewConfiguration;/**
*@describeviewpager的小圆点指示器
*/publicclassCirclePageIndicatorextendsViewimplementsOnPageChangeListener{
privatestaticfinalintINVALID_POINTER=-1;
privatefloatmRadius;
privatefinalPaintmPaintPageFill=newPaint(ANTI_ALIAS_FLAG);
privatefinalPaintmPaintStroke=newPaint(ANTI_ALIAS_FLAG);
privatefinalPaintmPaintFill=newPaint(ANTI_ALIAS_FLAG);
privateViewPagermViewPager;
privateViewPager.OnPageChangeListenermListener;
privateintmCurrentPage;
privateintmSnapPage;
privatefloatmPageOffset;
privateintmScrollState;
privateintmOrientation;
privatebooleanmCentered;
privatebooleanmSnap;
privateintmTouchSlop;
privatefloatmLastMotionX=-1;
privateintmActivePointerId=INVALID_POINTER;
privatebooleanmIsDragging;
privateContextcontext;
publicCirclePageIndicator(Contextcontext){
super(context);
this.context=context;
init(context);
}
publicCirclePageIndicator(Contextcontext,AttributeSetattrs){
super(context,attrs);
init(context);
}
privatevoidinit(Contextcontext){
mCentered=true;
mOrientation=0;
mPaintPageFill.setStyle(Style.FILL);
mPaintPageFill.setColor(0x00000000);
mPaintStroke.setStyle(Style.STROKE);
mPaintStroke.setColor(0xFFFF6600);
mPaintStroke.setStrokeWidth(getResources().getDimension(R.dimen.indicator_stroke_width));
mPaintFill.setStyle(Style.FILL);
mPaintFill.setColor(0xFFFF6600);
mRadius=getResources().getDimension(R.dimen.indicator_radius);
mSnap=false;
finalViewConfigurationconfiguration=ViewConfiguration.get(context);
mTouchSlop=ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);
}
publicvoidsetRadius(intdpValue){
floatscale=context.getResources().getDisplayMetrics().density;
mRadius=(int)(dpValue*scale+0.5f);
invalidate();
}
publicfloatfraction;
privatefloatparseRadiusIfNeed(floatpageFillRadius){
returnfraction==0?pageFillRadius:pageFillRadius+pageFillRadius/fraction;
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
if(mViewPager==null){
return;
}
finalintcount=mViewPager.getAdapter().getCount();
if(count==0){
return;
}
if(mCurrentPage>=count){
setCurrentItem(count-1);
return;
}
intlongSize;
intlongPaddingBefore;
intlongPaddingAfter;
intshortPaddingBefore;
if(mOrientation==HORIZONTAL){
longSize=getWidth();
longPaddingBefore=getPaddingLeft();
longPaddingAfter=getPaddingRight();
shortPaddingBefore=getPaddingTop();
}else{
longSize=getHeight();
longPaddingBefore=getPaddingTop();
longPaddingAfter=getPaddingBottom();
shortPaddingBefore=getPaddingLeft();
}
finalfloatthreeRadius=mRadius*5;
finalfloatshortOffset=shortPaddingBefore+mRadius;
floatlongOffset=longPaddingBefore+mRadius;
if(mCentered){
longOffset+=((longSize-longPaddingBefore-longPaddingAfter)/2.0f)-((count*threeRadius)/2.0f);
}
floatdX;
floatdY;
floatpageFillRadius=mRadius;
if(mPaintStroke.getStrokeWidth()>0){
pageFillRadius-=mPaintStroke.getStrokeWidth()*1.5f;//实心圆的半径
}
//Drawstrokedcircles
for(intiLoop=0;iLoop<count;iLoop++){
floatdrawLong=longOffset+(iLoop*threeRadius);
if(mOrientation==HORIZONTAL){
dX=drawLong;
dY=shortOffset;
}else{
dX=shortOffset;
dY=drawLong;
}
//Onlypaintfillifnotcompletelytransparent
if(mPaintPageFill.getAlpha()>0){
canvas.drawCircle(dX,dY,pageFillRadius,mPaintPageFill);
}
//Onlypaintstrokeifastrokewidthwasnon-zero
if(pageFillRadius!=mRadius){
canvas.drawCircle(dX,dY,mRadius,mPaintStroke);
}
}
//Drawthefilledcircleaccordingtothecurrentscroll
floatcx=(mSnap?mSnapPage:mCurrentPage)*threeRadius;
if(!mSnap){
cx+=mPageOffset*threeRadius;
}
if(mOrientation==HORIZONTAL){
dX=longOffset+cx;
dY=shortOffset;
}else{
dX=shortOffset;
dY=longOffset+cx;
}
canvas.drawCircle(dX,dY,parseRadiusIfNeed(pageFillRadius),mPaintFill);
}
publicbooleanonTouchEvent(android.view.MotionEventev){
if(super.onTouchEvent(ev)){
returntrue;
}
if((mViewPager==null)||(mViewPager.getAdapter().getCount()==0)){
returnfalse;
}
finalintaction=ev.getAction()&MotionEventCompat.ACTION_MASK;
switch(action){
caseMotionEvent.ACTION_DOWN:
mActivePointerId=MotionEventCompat.getPointerId(ev,0);
mLastMotionX=ev.getX();
break;
caseMotionEvent.ACTION_MOVE:{
finalintactivePointerIndex=MotionEventCompat.findPointerIndex(ev,mActivePointerId);
finalfloatx=MotionEventCompat.getX(ev,activePointerIndex);
finalfloatdeltaX=x-mLastMotionX;
if(!mIsDragging){
if(Math.abs(deltaX)>mTouchSlop){
mIsDragging=true;
}
}
if(mIsDragging){
mLastMotionX=x;
if(mViewPager.isFakeDragging()||mViewPager.beginFakeDrag()){
mViewPager.fakeDragBy(deltaX);
}
}
break;
}
caseMotionEvent.ACTION_CANCEL:
caseMotionEvent.ACTION_UP:
if(!mIsDragging){
finalintcount=mViewPager.getAdapter().getCount();
finalintwidth=getWidth();
finalfloathalfWidth=width/2f;
finalfloatsixthWidth=width/6f;
if((mCurrentPage>0)&&(ev.getX()<halfWidth-sixthWidth)){
if(action!=MotionEvent.ACTION_CANCEL){
mViewPager.setCurrentItem(mCurrent1);
}
returntrue;
}elseif((mCurrentPage<count-1)&&(ev.getX()>halfWidth+sixthWidth)){
if(action!=MotionEvent.ACTION_CANCEL){
mViewPager.setCurrentItem(mCurrentPage+1);
}
returntrue;
}
}
mIsDragging=false;
mActivePointerId=INVALID_POINTER;
if(mViewPager.isFakeDragging())
mViewPager.endFakeDrag();
break;
caseMotionEventCompat.ACTION_POINTER_DOWN:{
finalintindex=MotionEventCompat.getActionIndex(ev);
mLastMotionX=MotionEventCompat.getX(ev,index);
mActivePointerId=MotionEventCompat.getPointerId(ev,index);
break;
}
caseMotionEventCompat.ACTION_POINTER_UP:
finalintpointerIndex=MotionEventCompat.getActionIndex(ev);
finalintpointerId=MotionEventCompat.getPointerId(ev,pointerIndex);
if(pointerId==mActivePointerId){
finalintnewPointerIndex=pointerIndex==0?1:0;
mActivePointerId=MotionEventCompat.getPointerId(ev,newPointerIndex);
}
mLastMotionX=MotionEventCompat.getX(ev,MotionEventCompat.findPointerIndex(ev,mActivePointerId));
break;
}
returntrue;
}
publicvoidsetViewPager(ViewPagerview){
if(mViewPager==view){
return;
}
if(mViewPager!=null){
mViewPager.setOnPageChangeListener(null);
}
if(view.getAdapter()==null){
thrownewIllegalStateException("ViewPagerdoesnothaveadapterinstance.");
}
mViewPager=view;
mViewPager.setOnPageChangeListener(this);
invalidate();
}
publicvoidsetViewPager(ViewPagerview,intinitialPosition){
setViewPager(view);
setCurrentItem(initialPosition);
}
publicvoidsetCurrentItem(intitem){
if(mViewPager==null){
thrownewIllegalStateException("ViewPagerhasnotbeenbound.");
}
mViewPager.setCurrentItem(item);
mCurrentPage=item;
invalidate();
}
publicvoidnotifyDataSetChanged(){
invalidate();
}
@Override
publicvoidonPageScrollStateChanged(intstate){
mScrollState=state;
if(mListener!=null){
mListener.onPageScrollStateChanged(state);
}
}
@Override
publicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels){
mCurrentPage=position;
mPageOffset=positionOffset;
invalidate();
if(mListener!=null){
mListener.onPageScrolled(position,positionOffset,positionOffsetPixels);
}
}
@Override
publicvoidonPageSelected(intposition){
if(mSnap||mScrollState==ViewPager.SCROLL_STATE_IDLE){
mCurrentPage=position;
mSnapPage=position;
invalidate();
}
if(mListener!=null){
mListener.onPageSelected(position);
}
}
publicvoidsetOnPageChangeListener(ViewPager.OnPageChangeListenerlistener){
mListener=listener;
}
/**
*设置圆边框的颜色
*/
publicvoidsetStrokeColor(intcolor){
try{
mPaintStroke.setColor(color);
}catch(Exceptione){
mPaintStroke.setColor(0xFFFF6600);
e.printStackTrace();
}
}
/**
*设置中心圆的颜色
*
*@paramcolor
*/
publicvoidsetCircleColor(intcolor){
try{
mPaintFill.setColor(color);
}catch(Exceptione){
mPaintFill.setColor(0xFFFF6600);
e.printStackTrace();
}
}
publicvoidsetPageCircleColor(intcolor){
try{
mPaintPageFill.setColor(color);
}catch(Exceptione){
mPaintPageFill.setColor(0x00000000);
e.printStackTrace();
}
}
publicvoidsetStrokeWidth(floatwidth){
mPaintStroke.setStrokeWidth(width);
}
/*
*(non-Javadoc)
*
*@seeandroid.view.View#onMeasure(int,int)
*/
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
if(mOrientation==HORIZONTAL){
setMeasuredDimension(measureLong(widthMeasureSpec),measureShort(heightMeasureSpec));
}else{
setMeasuredDimension(measureShort(widthMeasureSpec),measureLong(heightMeasureSpec));
}
}
/**
*Determinesthewidthofthisview
*
*@parammeasureSpec
*
AmeasureSpecpackedintoanint
*@returnThewidthoftheview,honoringconstraintsfrommeasureSpec
*/
privateintmeasureLong(intmeasureSpec){
intresult;
intspecMode=MeasureSpec.getMode(measureSpec);
intspecSize=MeasureSpec.getSize(measureSpec);
if((specMode==MeasureSpec.EXACTLY)||(mViewPager==null)){
//Weweretoldhowbigtobe
result=specSize;
}else{
//Calculatethewidthaccordingtheviewscount
finalintcount=mViewPager.getAdapter().getCount();
result=(int)(getPaddingLeft()+getPaddingRight()+(count*2*mRadius)+(count-1)*mRadius*4+1);
//RespectAT_MOSTvalueifthatwaswhatiscalledforbymeasureSpec
if(specMode==MeasureSpec.AT_MOST){
result=Math.min(result,specSize);
}
}
returnresult;
}
/**
*Determinestheheightofthisview
*
*@parammeasureSpec
*
AmeasureSpecpackedintoanint
*@returnTheheightoftheview,honoringconstraintsfrommeasureSpec
*/
privateintmeasureShort(intmeasureSpec){
intresult;
intspecMode=MeasureSpec.getMode(measureSpec);
intspecSize=MeasureSpec.getSize(measureSpec);
if(specMode==MeasureSpec.EXACTLY){
//Weweretoldhowbigtobe
result=specSize;
}else{
//Measuretheheight
result=(int)(2*mRadius+getPaddingTop()+getPaddingBottom()+1);
//RespectAT_MOSTvalueifthatwaswhatiscalledforbymeasureSpec
if(specMode==MeasureSpec.AT_MOST){
result=Math.min(result,specSize);
}
}
returnresult;
}
@Override
publicvoidonRestoreInstanceState(Parcelablestate){
SavedStatesavedState=(SavedState)state;
super.onRestoreInstanceState(savedState.getSuperState());
mCurrentPage=savedState.currentPage;
mSnapPage=savedState.currentPage;
requestLayout();
}
@Override
publicParcelableonSaveInstanceState()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 团章测试题及答案
- 2025年连带责任担保协议范本
- 2025年债权转让和投资协同协议
- 2025年联合品牌策划营销合作共赢协议书
- 2025年合作伙伴关系框架协议全文
- 2025年长期订阅策划协议示例
- 企业法律风险的预防的背景意义及必要性
- 2025年婚姻解除协议书模板及操作策划详述
- 2025年化学品物流协同管理协议
- 教师教育内容的优化与能力提升的关系
- PCB制板要求模板-综合版
- 生产节拍生产节拍
- 集装箱板房技术要求
- 抗浮锚杆安全交底(全)
- 大厦火灾自动报警系统更换方案
- 国际学校六年级数学测(英文)
- 2022年泗阳县事业单位考试真题及答案
- 部编版五年级下册期末语文试卷答题卡及答案-五年级下册期末的答题卡
- 2023年安全生产月知识竞赛主题PPT动态模板(含具体内容)
- 棉花帝国:一部资本主义全球史
- 高考英语词汇3500电子版
评论
0/150
提交评论