失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android搜索关键字飞入飞出效果(播放器的搜索界面)

Android搜索关键字飞入飞出效果(播放器的搜索界面)

时间:2023-04-18 06:57:31

相关推荐

Android搜索关键字飞入飞出效果(播放器的搜索界面)

好多应用在搜索界面都有关键字飞入飞出的效果。我自己也实现了下。先上效果图:

实现该效果需要解决以下五点:

1.布局的选用。

2.确定动画区域,即布局的宽高。

3.对关键字坐标的随机分配。

4.对随机分配的坐标进行向中心靠拢。

5.动画的实现。

转载请注明出处:/sodino/article/details/7176796

下面各个击破:

1.布局的选用。

在五种常用布局中,可实现此效果的有AbsoluteLayout、FrameLayout、RelativeLayout三种。一开始我选用的AbsoluteLayout,运行结果出来后,发现AbsoluteLayout下的TextView一旦超出其显示范围,超出的范围将无法显示,而余下的两种布局,其超出的范围会自动换行显示出来(TextView长度超出父组件显示范围可在代码中避免,此处仅是举例,说明AbsoluteLayout的先天不足)。另,官方已不再推荐使用AbsoluteLayout,所以本处凭个人喜好我选用FrameLayout。

FrameLayout如何实现AbsoluteLayout对其子组件进行定点放置呢?答案在FrameLayout.LayoutParams上。该类有相关属性为leftMargin及topMargin。要将子组件左上角定点放置在其父组件中的(x,y)处,仅需对leftMargin赋值为x,对topMargin赋值为y即可。

2.确定动画区域,即布局的宽高。

在对显示关键字TextView进行分配坐标之前,应该要先知道父组件的宽高各有多少可供随机分配。

获取宽高使用到OnGlobalLayoutListener。本例中KeywordsFlow继承自FrameLayout,同时也实现了OnGlobalLayoutListener接口,在其初始化方法init()中设置了监听getViewTreeObserver().addOnGlobalLayoutListener(this);

当监听事件被触发时,即可获取而已的宽高。

[java]view plain copypublicvoidonGlobalLayout(){ inttmpW=getWidth(); inttmpH=getHeight(); if(width!=tmpW||height!=tmpH){ width=tmpW; height=tmpH; show(); } }

3.对关键字坐标的随机分配。

TextView坐标的随机是否到位分配决定着整体效果的好坏。

本例设定关键字最多为10个,在布局的X Y轴上各自进行10等分。每个关键字依照其添加顺序随机各自在X轴和Y轴上选择等分后的10点中的某个点为margin的值。此值为糙值,需要对X轴进行越界修正,对Y轴进行向中心靠拢修正。对X轴坐标的修正为如下:

[java]view plain copy//获取文本长度 Paintpaint=txt.getPaint(); intstrWidth=(int)Math.ceil(paint.measureText(keyword)); xy[IDX_TXT_LENGTH]=strWidth; //第一次修正:修正x坐标 if(xy[IDX_X]+strWidth>width-(xItem>>1)){ intbaseX=width-strWidth; //减少文本右边缘一样的概率 xy[IDX_X]=baseX-xItem+random.nextInt(xItem>>1); }elseif(xy[IDX_X]==0){ //减少文本左边缘一样的概率 xy[IDX_X]=Math.max(random.nextInt(xItem),xItem/3); }

4.对随机分配的坐标进行向中心靠拢。

此操作将修正Y轴坐标。

由于随机分配中,可能出现某个关键字在朝中心点方向上的空间中再没有其它关键字了,此时该关键字在Y轴上应该朝中心点靠拢。实现代码如下:

[java]view plain copy//第二次修正:修正y坐标 intyDistance=iXY[IDX_Y]-yCenter; //对于最靠近中心点的,其值不会大于yItem<br/> //对于可以一路下降到中心点的,则该值也是其应调整的大小<br/> intyMove=Math.abs(yDistance); inner:for(intk=i-1;k>=0;k--){ int[]kXY=(int[])listTxt.get(k).getTag(); intstartX=kXY[IDX_X]; intendX=startX+kXY[IDX_TXT_LENGTH]; //y轴以中心点为分隔线,在同一侧 if(yDistance*(kXY[IDX_Y]-yCenter)>0){ //Log.d("ANDROID_LAB","compare:"+ //listTxt.get(k).getText()); if(isXMixed(startX,endX,iXY[IDX_X],iXY[IDX_X]+iXY[IDX_TXT_LENGTH])){ inttmpMove=Math.abs(iXY[IDX_Y]-kXY[IDX_Y]); if(tmpMove>yItem){ yMove=tmpMove; }elseif(yMove>0){ //取消默认值。 yMove=0; } //Log.d("ANDROID_LAB","break"); breakinner; } } } //Log.d("ANDROID_LAB",txt.getText()+"yMove="+yMove); if(yMove>yItem){ intmaxMove=yMove-yItem; intrandomMove=random.nextInt(maxMove); intrealMove=Math.max(randomMove,maxMove>>1)*yDistance/Math.abs(yDistance); iXY[IDX_Y]=iXY[IDX_Y]-realMove; iXY[IDX_DIS_Y]=Math.abs(iXY[IDX_Y]-yCenter); //已经调整过前i个需要再次排序 sortXYList(listTxt,i+1); }

5.动画的实现。

每个TextView的动画都有包括三部分:伸缩动画ScaleAnimation、透明度渐变动画AlphaAnimation及位移动画TranslateAnimation。以上三个动画中除了位移动画是独立的,其它两种动画都是可以共用的。三种动画的组合使用AnimationSet拼装在一起同时作用在TextView上。动画的实现如下:

[java]view plain copypublicAnimationSetgetAnimationSet(int[]xy,intxCenter,intyCenter,inttype){ AnimationSetanimSet=newAnimationSet(true); animSet.setInterpolator(interpolator); if(type==OUTSIDE_TO_LOCATION){ animSet.addAnimation(animAlpha2Opaque); animSet.addAnimation(animScaleLarge2Normal); TranslateAnimationtranslate=newTranslateAnimation( (xy[IDX_X]+(xy[IDX_TXT_LENGTH]>>1)-xCenter)<<1,0,(xy[IDX_Y]-yCenter)<<1,0); animSet.addAnimation(translate); }elseif(type==LOCATION_TO_OUTSIDE){ animSet.addAnimation(animAlpha2Transparent); animSet.addAnimation(animScaleNormal2Large); TranslateAnimationtranslate=newTranslateAnimation(0, (xy[IDX_X]+(xy[IDX_TXT_LENGTH]>>1)-xCenter)<<1,0,(xy[IDX_Y]-yCenter)<<1); animSet.addAnimation(translate); }elseif(type==LOCATION_TO_CENTER){ animSet.addAnimation(animAlpha2Transparent); animSet.addAnimation(animScaleNormal2Zero); TranslateAnimationtranslate=newTranslateAnimation(0,(-xy[IDX_X]+xCenter),0,(-xy[IDX_Y]+yCenter)); animSet.addAnimation(translate); }elseif(type==CENTER_TO_LOCATION){ animSet.addAnimation(animAlpha2Opaque); animSet.addAnimation(animScaleZero2Normal); TranslateAnimationtranslate=newTranslateAnimation((-xy[IDX_X]+xCenter),0,(-xy[IDX_Y]+yCenter),0); animSet.addAnimation(translate); } animSet.setDuration(animDuration); returnanimSet; }

最后有个小点需要再次提醒下,使用KeywordsFlow时,在Eclipse开发环境下导出混淆包时,需要在proguard.cfg中添加:-keep public class * extends android.widget.FrameLayout

否则将会提示无法找到该类。

好了,文嗦嗦的东西到此结束,贴上Java代码如下,xml代码请根据效果图自己鼓捣吧。[java]view plain copyActKeywordAnim.java packagelab.sodino.searchkeywordanim; importjava.util.Random; importandroid.app.Activity; importandroid.content.Intent; .Uri; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.TextView; /** *@authorSodinoE-mail:sodinoopen@ *@versionTime:-12-26下午03:34:16 */ publicclassActKeywordAnimextendsActivityimplementsOnClickListener{ publicstaticfinalString[]keywords={"QQ","Sodino","APK","GFW","铅笔",// "短信","桌面精灵","MacBookPro","平板电脑","雅诗兰黛",// "卡西欧TR-100","笔记本","SPYMouse","ThinkpadE40","捕鱼达人",// "内存清理","地图","导航","闹钟","主题",// "通讯录","播放器","CSDNleak","安全","3D",// "美女","天气","4743G","戴尔","联想",// "欧朋","浏览器","愤怒的小鸟","mmShow","网易公开课",// "iciba","油水关系","网游App","互联网","365日历",// "脸部识别","Chrome","Safari","中国版Siri","A5处理器",// "iPhone4S","摩托ME525","魅族M9","尼康S2500"}; privateKeywordsFlowkeywordsFlow; privateButtonbtnIn,btnOut; publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); btnIn=(Button)findViewById(R.id.btnIn); btnOut=(Button)findViewById(R.id.btnOut); btnIn.setOnClickListener(this); btnOut.setOnClickListener(this); keywordsFlow=(KeywordsFlow)findViewById(R.id.keywordsFlow); keywordsFlow.setDuration(800l); keywordsFlow.setOnItemClickListener(this); //添加 feedKeywordsFlow(keywordsFlow,keywords); keywordsFlow.go2Show(KeywordsFlow.ANIMATION_IN); } privatestaticvoidfeedKeywordsFlow(KeywordsFlowkeywordsFlow,String[]arr){ Randomrandom=newRandom(); for(inti=0;i<KeywordsFlow.MAX;i++){ intran=random.nextInt(arr.length); Stringtmp=arr[ran]; keywordsFlow.feedKeyword(tmp); } } @Override publicvoidonClick(Viewv){ if(v==btnIn){ keywordsFlow.rubKeywords(); //keywordsFlow.rubAllViews(); feedKeywordsFlow(keywordsFlow,keywords); keywordsFlow.go2Show(KeywordsFlow.ANIMATION_IN); }elseif(v==btnOut){ keywordsFlow.rubKeywords(); //keywordsFlow.rubAllViews(); feedKeywordsFlow(keywordsFlow,keywords); keywordsFlow.go2Show(KeywordsFlow.ANIMATION_OUT); }elseif(vinstanceofTextView){ Stringkeyword=((TextView)v).getText().toString(); Intentintent=newIntent(); intent.setAction(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse(".hk/#q="+keyword)); startActivity(intent); } } }

[java]view plain copyKeywordsFlow.java packagelab.sodino.searchkeywordanim; importjava.util.LinkedList; importjava.util.Random; importjava.util.Vector; importandroid.content.Context; importandroid.graphics.Paint; importandroid.util.AttributeSet; importandroid.util.TypedValue; importandroid.view.Gravity; importandroid.view.View; importandroid.view.ViewTreeObserver.OnGlobalLayoutListener; importandroid.view.animation.AlphaAnimation; importandroid.view.animation.Animation; importandroid.view.animation.Animation.AnimationListener; importandroid.view.animation.AnimationSet; importandroid.view.animation.AnimationUtils; importandroid.view.animation.Interpolator; importandroid.view.animation.ScaleAnimation; importandroid.view.animation.TranslateAnimation; importandroid.widget.FrameLayout; importandroid.widget.TextView; /** *注意,出包时出混淆包,应在proguard.cfg中加入:<br/> *-keeppublicclass*extendsandroid.widget.FrameLayout<br/> * *@authorSodinoE-mail:sodinoopen@ *@versionTime:-12-26下午03:34:16 */ publicclassKeywordsFlowextendsFrameLayoutimplementsOnGlobalLayoutListener{ publicstaticfinalintIDX_X=0; publicstaticfinalintIDX_Y=1; publicstaticfinalintIDX_TXT_LENGTH=2; publicstaticfinalintIDX_DIS_Y=3; /**由外至内的动画。*/ publicstaticfinalintANIMATION_IN=1; /**由内至外的动画。*/ publicstaticfinalintANIMATION_OUT=2; /**位移动画类型:从外围移动到坐标点。*/ publicstaticfinalintOUTSIDE_TO_LOCATION=1; /**位移动画类型:从坐标点移动到外围。*/ publicstaticfinalintLOCATION_TO_OUTSIDE=2; /**位移动画类型:从中心点移动到坐标点。*/ publicstaticfinalintCENTER_TO_LOCATION=3; /**位移动画类型:从坐标点移动到中心点。*/ publicstaticfinalintLOCATION_TO_CENTER=4; publicstaticfinallongANIM_DURATION=800l; publicstaticfinalintMAX=10; publicstaticfinalintTEXT_SIZE_MAX=25; publicstaticfinalintTEXT_SIZE_MIN=15; privateOnClickListeneritemClickListener; privatestaticInterpolatorinterpolator; privatestaticAlphaAnimationanimAlpha2Opaque; privatestaticAlphaAnimationanimAlpha2Transparent; privatestaticScaleAnimationanimScaleLarge2Normal,animScaleNormal2Large,animScaleZero2Normal, animScaleNormal2Zero; /**存储显示的关键字。*/ privateVector<String>vecKeywords; privateintwidth,height; /** *go2Show()中被赋值为true,标识开发人员触发其开始动画显示。<br/> *本标识的作用是防止在填充keywrods未完成的过程中获取到width和height后提前启动动画。<br/> *在show()方法中其被赋值为false。<br/> *真正能够动画显示的另一必要条件:width和height不为0。<br/> */ privatebooleanenableShow; privateRandomrandom; /** *@seeANIMATION_IN *@seeANIMATION_OUT *@seeOUTSIDE_TO_LOCATION *@seeLOCATION_TO_OUTSIDE *@seeLOCATION_TO_CENTER *@seeCENTER_TO_LOCATION **/ privateinttxtAnimInType,txtAnimOutType; /**最近一次启动动画显示的时间。*/ privatelonglastStartAnimationTime; /**动画运行时间。*/ privatelonganimDuration; publicKeywordsFlow(Contextcontext,AttributeSetattrs,intdefStyle){ super(context,attrs,defStyle); init(); } publicKeywordsFlow(Contextcontext,AttributeSetattrs){ super(context,attrs); init(); } publicKeywordsFlow(Contextcontext){ super(context); init(); } privatevoidinit(){ lastStartAnimationTime=0l; animDuration=ANIM_DURATION; random=newRandom(); vecKeywords=newVector<String>(MAX); getViewTreeObserver().addOnGlobalLayoutListener(this); interpolator=AnimationUtils.loadInterpolator(getContext(),android.R.anim.decelerate_interpolator); animAlpha2Opaque=newAlphaAnimation(0.0f,1.0f); animAlpha2Transparent=newAlphaAnimation(1.0f,0.0f); animScaleLarge2Normal=newScaleAnimation(2,1,2,1); animScaleNormal2Large=newScaleAnimation(1,2,1,2); animScaleZero2Normal=newScaleAnimation(0,1,0,1); animScaleNormal2Zero=newScaleAnimation(1,0,1,0); } publiclonggetDuration(){ returnanimDuration; } publicvoidsetDuration(longduration){ animDuration=duration; } publicbooleanfeedKeyword(Stringkeyword){ booleanresult=false; if(vecKeywords.size()<MAX){ result=vecKeywords.add(keyword); } returnresult; } /** *开始动画显示。<br/> *之前已经存在的TextView将会显示退出动画。<br/> * *@return正常显示动画返回true;反之为false。返回false原因如下:<br/> *1.时间上不允许,受lastStartAnimationTime的制约;<br/> *2.未获取到width和height的值。<br/> */ publicbooleango2Show(intanimType){ if(System.currentTimeMillis()-lastStartAnimationTime>animDuration){ enableShow=true; if(animType==ANIMATION_IN){ txtAnimInType=OUTSIDE_TO_LOCATION; txtAnimOutType=LOCATION_TO_CENTER; }elseif(animType==ANIMATION_OUT){ txtAnimInType=CENTER_TO_LOCATION; txtAnimOutType=LOCATION_TO_OUTSIDE; } disapper(); booleanresult=show(); returnresult; } returnfalse; } privatevoiddisapper(){ intsize=getChildCount(); for(inti=size-1;i>=0;i--){ finalTextViewtxt=(TextView)getChildAt(i); if(txt.getVisibility()==View.GONE){ removeView(txt); continue; } FrameLayout.LayoutParamslayParams=(LayoutParams)txt.getLayoutParams(); //Log.d("ANDROID_LAB",txt.getText()+"leftM="+ //layParams.leftMargin+"topM="+layParams.topMargin //+"width="+txt.getWidth()); int[]xy=newint[]{layParams.leftMargin,layParams.topMargin,txt.getWidth()}; AnimationSetanimSet=getAnimationSet(xy,(width>>1),(height>>1),txtAnimOutType); txt.startAnimation(animSet); animSet.setAnimationListener(newAnimationListener(){ publicvoidonAnimationStart(Animationanimation){ } publicvoidonAnimationRepeat(Animationanimation){ } publicvoidonAnimationEnd(Animationanimation){ txt.setOnClickListener(null); txt.setClickable(false); txt.setVisibility(View.GONE); } }); } } privatebooleanshow(){ if(width>0&&height>0&&vecKeywords!=null&&vecKeywords.size()>0&&enableShow){ enableShow=false; lastStartAnimationTime=System.currentTimeMillis(); intxCenter=width>>1,yCenter=height>>1; intsize=vecKeywords.size(); intxItem=width/size,yItem=height/size; //Log.d("ANDROID_LAB","--------------------------width="+width+ //"height="+height+"xItem="+xItem //+"yItem="+yItem+"---------------------------"); LinkedList<Integer>listX=newLinkedList<Integer>(),listY=newLinkedList<Integer>(); for(inti=0;i<size;i++){ //准备随机候选数,分别对应x/y轴位置 listX.add(i*xItem); listY.add(i*yItem+(yItem>>2)); } //TextView[]txtArr=newTextView[size]; LinkedList<TextView>listTxtTop=newLinkedList<TextView>(); LinkedList<TextView>listTxtBottom=newLinkedList<TextView>(); for(inti=0;i<size;i++){ Stringkeyword=vecKeywords.get(i); //随机颜色 intranColor=0xff000000|random.nextInt(0x0077ffff); //随机位置,糙值 intxy[]=randomXY(random,listX,listY,xItem); //随机字体大小 inttxtSize=TEXT_SIZE_MIN+random.nextInt(TEXT_SIZE_MAX-TEXT_SIZE_MIN+1); //实例化TextView finalTextViewtxt=newTextView(getContext()); txt.setOnClickListener(itemClickListener); txt.setText(keyword); txt.setTextColor(ranColor); txt.setTextSize(PLEX_UNIT_SP,txtSize); txt.setShadowLayer(2,2,2,0xff696969); txt.setGravity(Gravity.CENTER); //获取文本长度 Paintpaint=txt.getPaint(); intstrWidth=(int)Math.ceil(paint.measureText(keyword)); xy[IDX_TXT_LENGTH]=strWidth; //第一次修正:修正x坐标 if(xy[IDX_X]+strWidth>width-(xItem>>1)){ intbaseX=width-strWidth; //减少文本右边缘一样的概率 xy[IDX_X]=baseX-xItem+random.nextInt(xItem>>1); }elseif(xy[IDX_X]==0){ //减少文本左边缘一样的概率 xy[IDX_X]=Math.max(random.nextInt(xItem),xItem/3); } xy[IDX_DIS_Y]=Math.abs(xy[IDX_Y]-yCenter); txt.setTag(xy); if(xy[IDX_Y]>yCenter){ listTxtBottom.add(txt); }else{ listTxtTop.add(txt); } } attach2Screen(listTxtTop,xCenter,yCenter,yItem); attach2Screen(listTxtBottom,xCenter,yCenter,yItem); returntrue; } returnfalse; } /**修正TextView的Y坐标将将其添加到容器上。*/ privatevoidattach2Screen(LinkedList<TextView>listTxt,intxCenter,intyCenter,intyItem){ intsize=listTxt.size(); sortXYList(listTxt,size); for(inti=0;i<size;i++){ TextViewtxt=listTxt.get(i); int[]iXY=(int[])txt.getTag(); //Log.d("ANDROID_LAB","fix["+txt.getText()+"]x:"+ //iXY[IDX_X]+"y:"+iXY[IDX_Y]+"r2=" //+iXY[IDX_DIS_Y]); //第二次修正:修正y坐标 intyDistance=iXY[IDX_Y]-yCenter; //对于最靠近中心点的,其值不会大于yItem<br/> //对于可以一路下降到中心点的,则该值也是其应调整的大小<br/> intyMove=Math.abs(yDistance); inner:for(intk=i-1;k>=0;k--){ int[]kXY=(int[])listTxt.get(k).getTag(); intstartX=kXY[IDX_X]; intendX=startX+kXY[IDX_TXT_LENGTH]; //y轴以中心点为分隔线,在同一侧 if(yDistance*(kXY[IDX_Y]-yCenter)>0){ //Log.d("ANDROID_LAB","compare:"+ //listTxt.get(k).getText()); if(isXMixed(startX,endX,iXY[IDX_X],iXY[IDX_X]+iXY[IDX_TXT_LENGTH])){ inttmpMove=Math.abs(iXY[IDX_Y]-kXY[IDX_Y]); if(tmpMove>yItem){ yMove=tmpMove; }elseif(yMove>0){ //取消默认值。 yMove=0; } //Log.d("ANDROID_LAB","break"); breakinner; } } } //Log.d("ANDROID_LAB",txt.getText()+"yMove="+yMove); if(yMove>yItem){ intmaxMove=yMove-yItem; intrandomMove=random.nextInt(maxMove); intrealMove=Math.max(randomMove,maxMove>>1)*yDistance/Math.abs(yDistance); iXY[IDX_Y]=iXY[IDX_Y]-realMove; iXY[IDX_DIS_Y]=Math.abs(iXY[IDX_Y]-yCenter); //已经调整过前i个需要再次排序 sortXYList(listTxt,i+1); } FrameLayout.LayoutParamslayParams=newFrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); layParams.gravity=Gravity.LEFT|Gravity.TOP; layParams.leftMargin=iXY[IDX_X]; layParams.topMargin=iXY[IDX_Y]; addView(txt,layParams); //动画 AnimationSetanimSet=getAnimationSet(iXY,xCenter,yCenter,txtAnimInType); txt.startAnimation(animSet); } } publicAnimationSetgetAnimationSet(int[]xy,intxCenter,intyCenter,inttype){ AnimationSetanimSet=newAnimationSet(true); animSet.setInterpolator(interpolator); if(type==OUTSIDE_TO_LOCATION){ animSet.addAnimation(animAlpha2Opaque); animSet.addAnimation(animScaleLarge2Normal); TranslateAnimationtranslate=newTranslateAnimation( (xy[IDX_X]+(xy[IDX_TXT_LENGTH]>>1)-xCenter)<<1,0,(xy[IDX_Y]-yCenter)<<1,0); animSet.addAnimation(translate); }elseif(type==LOCATION_TO_OUTSIDE){ animSet.addAnimation(animAlpha2Transparent); animSet.addAnimation(animScaleNormal2Large); TranslateAnimationtranslate=newTranslateAnimation(0, (xy[IDX_X]+(xy[IDX_TXT_LENGTH]>>1)-xCenter)<<1,0,(xy[IDX_Y]-yCenter)<<1); animSet.addAnimation(translate); }elseif(type==LOCATION_TO_CENTER){ animSet.addAnimation(animAlpha2Transparent); animSet.addAnimation(animScaleNormal2Zero); TranslateAnimationtranslate=newTranslateAnimation(0,(-xy[IDX_X]+xCenter),0,(-xy[IDX_Y]+yCenter)); animSet.addAnimation(translate); }elseif(type==CENTER_TO_LOCATION){ animSet.addAnimation(animAlpha2Opaque); animSet.addAnimation(animScaleZero2Normal); TranslateAnimationtranslate=newTranslateAnimation((-xy[IDX_X]+xCenter),0,(-xy[IDX_Y]+yCenter),0); animSet.addAnimation(translate); } animSet.setDuration(animDuration); returnanimSet; } /** *根据与中心点的距离由近到远进行冒泡排序。 * *@paramendIdx *起始位置。 *@paramtxtArr *待排序的数组。 * */ privatevoidsortXYList(LinkedList<TextView>listTxt,intendIdx){ for(inti=0;i<endIdx;i++){ for(intk=i+1;k<endIdx;k++){ if(((int[])listTxt.get(k).getTag())[IDX_DIS_Y]<((int[])listTxt.get(i).getTag())[IDX_DIS_Y]){ TextViewiTmp=listTxt.get(i); TextViewkTmp=listTxt.get(k); listTxt.set(i,kTmp); listTxt.set(k,iTmp); } } } } /**A线段与B线段所代表的直线在X轴映射上是否有交集。*/ privatebooleanisXMixed(intstartA,intendA,intstartB,intendB){ booleanresult=false; if(startB>=startA&&startB<=endA){ result=true; }elseif(endB>=startA&&endB<=endA){ result=true; }elseif(startA>=startB&&startA<=endB){ result=true; }elseif(endA>=startB&&endA<=endB){ result=true; } returnresult; } privateint[]randomXY(Randomran,LinkedList<Integer>listX,LinkedList<Integer>listY,intxItem){ int[]arr=newint[4]; arr[IDX_X]=listX.remove(ran.nextInt(listX.size())); arr[IDX_Y]=listY.remove(ran.nextInt(listY.size())); returnarr; } publicvoidonGlobalLayout(){ inttmpW=getWidth(); inttmpH=getHeight(); if(width!=tmpW||height!=tmpH){ width=tmpW; height=tmpH; show(); } } publicVector<String>getKeywords(){ returnvecKeywords; } publicvoidrubKeywords(){ vecKeywords.clear(); } /**直接清除所有的TextView。在清除之前不会显示动画。*/ publicvoidrubAllViews(){ removeAllViews(); } publicvoidsetOnItemClickListener(OnClickListenerlistener){ itemClickListener=listener; } //publicvoidonDraw(Canvascanvas){//super.onDraw(canvas); //Paintp=newPaint(); //p.setColor(Color.BLACK); //canvas.drawCircle((width>>1)-2,(height>>1)-2,4,p); //p.setColor(Color.RED); //} }

如果觉得《Android搜索关键字飞入飞出效果(播放器的搜索界面)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。