Android如何实现仿直播类app赠送礼物功能(android,移动开发)

时间:2024-05-06 22:27:45 作者 : 石家庄SEO 分类 : 移动开发
  • TAG :

实现的是播放本地的视频文件:

/***直播界面,用于对接直播功能*/publicclassLiveFragextendsFragment{privateImageViewimg_thumb;privateVideoViewvideo_view;@Nullable@OverridepublicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){Viewview=inflater.inflate(R.layout.frag_live,null);img_thumb=view.findViewById(R.id.img_thumb);img_thumb.setVisibility(View.GONE);video_view=view.findViewById(R.id.video_view);video_view.setVisibility(View.VISIBLE);video_view.setVideoURI(Uri.parse("android.resource://"+getActivity().getPackageName()+"/"+R.raw.video_1));video_view.start();video_view.setOnCompletionListener(newMediaPlayer.OnCompletionListener(){@OverridepublicvoidonCompletion(MediaPlayermp){video_view.setVideoURI(Uri.parse("android.resource://"+getActivity().getPackageName()+"/"+R.raw.video_1));//或//mVideoView.setVideoPath(Uri.parse(_filePath));video_view.start();}});returnview;}}

布局文件 frag_live.xml 如下:

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><VideoViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="false"android:focusable="false"android:visibility="gone"/><ImageViewandroid:id="@+id/img_thumb"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="false"android:focusable="false"android:scaleType="centerCrop"android:src="@mipmap/img_video_1"android:visibility="visible"/></LinearLayout>

滑动隐藏效果

需要实现的效果如下:

Android如何实现仿直播类app赠送礼物功能

自定义DialogFragment,使用ViewPager,第一个为空的Fragment,第二个为我们需要的Fragment,左右滑动来切换显示和隐藏效果。

观众功能交互页面 InteractiveFrag 如下:

/***观众功能交互页面,滑动隐藏效果*/publicclassInteractiveFragextendsDialogFragment{publicViewview;publicContextmyContext;privateViewPagervp_interactive;privateLayerFraglayerFrag;@OverridepublicViewonCreateView(LayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){view=inflater.inflate(R.layout.frag_interactive,null);//初始化initView();initData();returnview;}/***初始化View*/publicvoidinitView(){vp_interactive=view.findViewById(R.id.vp_interactive);}/***初始化数据*/publicvoidinitData(){//EmptyFrag:什么都没有//LayerFrag:交互界面//这样就达到了滑动隐藏交互的需求vp_interactive.setAdapter(newFragmentPagerAdapter(getChildFragmentManager()){@OverridepublicintgetCount(){return2;}@OverridepublicFragmentgetItem(intposition){if(position==0){returnnewEmptyFrag();//返回空界面的fragment}elseif(position==1){returnlayerFrag=newLayerFrag();//返回交互界面的frag}else{//设置默认returnnewEmptyFrag();}}});//设置默认显示交互界面vp_interactive.setCurrentItem(1);//同时将界面改为resize已达到软键盘弹出时Fragment不会跟随移动getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);}@OverridepublicDialogonCreateDialog(BundlesavedInstanceState){//设置DialogFragment的样式,这里的代码最好还是用我的,大家不要改动Dialogdialog=newDialog(getActivity(),R.style.MainDialog){@OverridepublicvoidonBackPressed(){super.onBackPressed();getActivity().finish();}};returndialog;}}

frag_interactive.xml文件如下:

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><androidx.viewpager.widget.ViewPagerandroid:id="@+id/vp_interactive"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

用户交互页 LayerFrag:

publicclassLayerFragextendsFragment{@Nullable@OverridepublicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){returninflater.inflate(R.layout.frag_layer,null);}}

frag_layer:

<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:id="@+id/ll_anchor"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center_vertical"android:orientation="horizontal"android:paddingLeft="10dp"android:paddingTop="10dp"><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:background="@drawable/bg_radius_top_black"android:gravity="center_vertical"android:orientation="vertical"android:paddingLeft="55dp"android:paddingTop="2dp"android:paddingRight="10dp"android:paddingBottom="2dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="十三妹哦"android:textColor="@android:color/white"android:textSize="12sp"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:orientation="horizontal"><ImageViewandroid:layout_width="35dp"android:layout_height="20dp"android:src="@drawable/hani_icon_tag_exp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:text="17万"android:textColor="@android:color/white"android:textSize="10sp"/></LinearLayout></LinearLayout><com.hongx.zhibo.utils.CircleImageViewandroid:id="@+id/lv_anchorIcon"android:layout_width="50dp"android:layout_height="50dp"android:src="@drawable/zf"app:border_color="@color/colorWhite"app:border_width="1dp"/></RelativeLayout><com.hongx.zhibo.utils.HorizontalListViewandroid:id="@+id/hlv_audience"android:layout_width="match_parent"android:layout_height="45dp"android:layout_marginLeft="10dp"/></LinearLayout><RelativeLayoutandroid:id="@+id/rl_num"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/ll_anchor"android:layout_marginTop="5dp"android:paddingLeft="10dp"android:paddingRight="10dp"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/bg_radius_bottom_pink"android:gravity="center_vertical"android:paddingLeft="10dp"android:paddingTop="2dp"android:paddingRight="10dp"android:paddingBottom="2dp"><ImageViewandroid:layout_width="20dp"android:layout_height="10dp"android:src="@drawable/molive_icon_charm_lv_20"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:text="小时榜单第5名"android:textColor="#fff"android:textSize="10sp"/></LinearLayout><TextViewandroid:id="@+id/tv_momocode"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:background="@drawable/bg_radius_top_black"android:paddingLeft="10dp"android:paddingTop="2dp"android:paddingRight="10dp"android:paddingBottom="2dp"android:text="MoMo:12345678"android:textColor="@android:color/white"android:textSize="10sp"/></RelativeLayout><LinearLayoutandroid:id="@+id/ll_gift_group"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_above="@+id/lv_message"android:layout_marginTop="10dp"android:layout_marginBottom="10dp"android:animateLayoutChanges="true"android:gravity="top"android:orientation="vertical"/><ListViewandroid:id="@+id/lv_message"android:layout_width="230dp"android:layout_height="150dp"android:layout_above="@+id/fl_bottom"android:layout_marginLeft="10dp"android:cacheColorHint="#00000000"android:divider="@null"android:dividerHeight="5dp"android:listSelector="#00000000"android:scrollbarStyle="outsideOverlay"android:scrollbars="none"android:transcriptMode="normal"/><FrameLayoutandroid:id="@+id/fl_bottom"android:layout_width="match_parent"android:layout_height="70dp"android:layout_alignParentStart="true"android:layout_alignParentBottom="true"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/transparent"android:gravity="center_vertical"android:orientation="horizontal"android:paddingLeft="10dp"android:paddingRight="10dp"><Buttonandroid:id="@+id/tv_chat"android:layout_width="40dp"android:layout_height="70dp"android:gravity="center"android:text="聊天"android:textColor="#333"android:textSize="10sp"/><Viewandroid:layout_width="0dp"android:layout_height="1dp"android:layout_weight="1"/><Buttonandroid:id="@+id/btn_gift01"android:layout_width="40dp"android:layout_height="70dp"android:layout_marginRight="5dp"android:gravity="center"android:text="送香皂"android:textColor="#333"android:textSize="12sp"/><Buttonandroid:id="@+id/btn_gift02"android:layout_width="40dp"android:layout_height="70dp"android:layout_marginRight="5dp"android:gravity="center"android:text="送玫瑰"android:textColor="#333"android:textSize="12sp"/><Buttonandroid:id="@+id/btn_gift03"android:layout_width="40dp"android:layout_height="70dp"android:layout_marginRight="5dp"android:gravity="center"android:text="送爱心"android:textColor="#333"android:textSize="12sp"/><Buttonandroid:id="@+id/btn_gift04"android:layout_width="40dp"android:layout_height="70dp"android:layout_marginRight="5dp"android:gravity="center"android:text="送蛋糕"android:textColor="#333"android:textSize="12sp"/></LinearLayout><LinearLayoutandroid:id="@+id/ll_inputparent"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="5dp"android:background="@android:color/white"android:paddingLeft="10dp"android:paddingRight="10dp"android:visibility="gone"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_vertical"android:orientation="horizontal"><EditTextandroid:id="@+id/et_chat"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@android:color/white"android:hint="在此输入你要说的话!"android:maxLength="30"android:paddingTop="10dp"android:paddingBottom="10dp"android:textColor="#888889"android:textColorHint="#c8c8c8"android:textSize="12sp"/><TextViewandroid:id="@+id/tv_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:background="@android:color/holo_blue_bright"android:paddingLeft="10dp"android:paddingTop="5dp"android:paddingRight="10dp"android:paddingBottom="5dp"android:text="发送"android:textColor="@android:color/white"android:textSize="12sp"/></LinearLayout></LinearLayout></FrameLayout></RelativeLayout>

EmptyFrag:

/***空的fragment*/publicclassEmptyFragextendsFragment{@Nullable@OverridepublicViewonCreateView(@NonNullLayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){returninflater.inflate(R.layout.frag_empty,null);}}

frag_empty.xml:

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/transparent"android:orientation="vertical"></LinearLayout>

在MainActivity中使用FrameLayout布局,将观众功能交互页面 InteractiveFrag 覆盖在 直播页面LiveFrag上面。

MainActivity:

publicclassMainActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//加载直播fragmentLiveFragliveFrag=newLiveFrag();getSupportFragmentManager().beginTransaction().add(R.id.fl_root,liveFrag).commit();//加载newInteractiveFrag().show(getSupportFragmentManager(),"InteractiveFrag");}}

activity_main.xml :

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/fl_root"android:layout_width="match_parent"android:layout_height="match_parent"/></RelativeLayout>

用户交互页实现

MagicTextView动画效果

MagicTextView代码在文章最后展示。

我们先实现如下动画效果

Android如何实现仿直播类app赠送礼物功能

<com.hongx.zhibo.utils.MagicTextViewandroid:id="@+id/mtv_giftNum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="5dp"android:layout_toRightOf="@+id/rlparent"android:includeFontPadding="false"android:text="x1"android:textColor="@android:color/holo_red_dark"android:textSize="30sp"android:textStyle="bold"app:strokeColor="@android:color/white"app:strokeJoinStyle="miter"app:strokeWidth="2"/>

动画:

publicclassNumberAnim{privateAnimatorlastAnimator;publicvoidshowAnimator(Viewv){if(lastAnimator!=null){lastAnimator.removeAllListeners();lastAnimator.cancel();lastAnimator.end();}ObjectAnimatoranimScaleX=ObjectAnimator.ofFloat(v,"scaleX",1.3f,1.0f);ObjectAnimatoranimScaleY=ObjectAnimator.ofFloat(v,"scaleY",1.3f,1.0f);AnimatorSetanimSet=newAnimatorSet();animSet.playTogether(animScaleX,animScaleY);animSet.setDuration(200);lastAnimator=animSet;animSet.start();}}mtv_giftNum.setText("x"+count);giftNumberAnim=newNumberAnim();//初始化数字动画mtv_giftNum.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){count++;mtv_giftNum.setText("x"+count);giftNumberAnim.showAnimator(mtv_giftNum);}});

礼物进入时动画

Android如何实现仿直播类app赠送礼物功能

进入动画设置为decelerate_interpolator减速插值器:

<?xmlversion="1.0"encoding="utf-8"?><translatexmlns:android="http://schemas.android.com/apk/res/android"android:duration="500"android:fromXDelta="-100%p"android:interpolator="@android:anim/decelerate_interpolator"android:toYDelta="0%p"></translate>/***刷礼物的方法*/privatevoidshowGift(Stringtag){ViewnewGiftView=ll_gift_group.findViewWithTag(tag);//是否有该tag类型的礼物if(newGiftView==null){//获取礼物newGiftView=getNewGiftView(tag);ll_gift_group.addView(newGiftView);//播放动画newGiftView.startAnimation(inAnim);finalMagicTextViewmtv_giftNum=newGiftView.findViewById(R.id.mtv_giftNum);inAnim.setAnimationListener(newAnimation.AnimationListener(){@OverridepublicvoidonAnimationStart(Animationanimation){}@OverridepublicvoidonAnimationRepeat(Animationanimation){}@OverridepublicvoidonAnimationEnd(Animationanimation){giftNumberAnim.showAnimator(mtv_giftNum);}});}else{//如果列表中已经有了该类型的礼物,则不再新建,直接拿出//更新标识,记录最新修改的时间,用于回收判断ImageViewiv_gift=newGiftView.findViewById(R.id.iv_gift);iv_gift.setTag(System.currentTimeMillis());//更新标识,更新记录礼物个数MagicTextViewmtv_giftNum=newGiftView.findViewById(R.id.mtv_giftNum);intgiftCount=(int)mtv_giftNum.getTag()+1;//递增mtv_giftNum.setText("x"+giftCount);mtv_giftNum.setTag(giftCount);giftNumberAnim.showAnimator(mtv_giftNum);}}/***获取礼物*/privateViewgetNewGiftView(Stringtag){//添加标识,该view若在layout中存在,就不在生成(用于findViewWithTag判断是否存在)ViewgiftView=LayoutInflater.from(myContext).inflate(R.layout.item_gift,null);giftView.setTag(tag);//添加标识,记录生成时间,回收时用于判断是否是最新的,回收最老的ImageViewiv_gift=giftView.findViewById(R.id.iv_gift);iv_gift.setTag(System.currentTimeMillis());//添加标识,记录礼物个数MagicTextViewmtv_giftNum=giftView.findViewById(R.id.mtv_giftNum);mtv_giftNum.setTag(1);mtv_giftNum.setText("x1");switch(tag){case"gift01":iv_gift.setImageResource(GiftIcon[0]);break;case"gift02":iv_gift.setImageResource(GiftIcon[1]);break;case"gift03":iv_gift.setImageResource(GiftIcon[2]);break;case"gift04":iv_gift.setImageResource(GiftIcon[3]);break;}LinearLayout.LayoutParamslp=newLinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);lp.topMargin=10;giftView.setLayoutParams(lp);returngiftView;}@OverridepublicvoidonClick(Viewv){switch(v.getId()){caseR.id.btn_gift01://礼物1,送香皂showGift("gift01");break;caseR.id.btn_gift02://礼物2,送玫瑰showGift("gift02");break;caseR.id.btn_gift03://礼物3,送爱心showGift("gift03");break;caseR.id.btn_gift04://礼物4,送蛋糕showGift("gift04");break;}}

礼物移出动画

实现的效果如下:

Android如何实现仿直播类app赠送礼物功能

礼物移出时使用accelerate_interpolator加速差值器

<?xmlversion="1.0"encoding="utf-8"?><translatexmlns:android="http://schemas.android.com/apk/res/android"android:duration="500"android:fromYDelta="0%p"android:interpolator="@android:anim/accelerate_interpolator"android:toYDelta="-100%p"></translate>/***移除礼物列表里的giftView*/privatevoidremoveGiftView(finalintindex){//移除列表,外加退出动画finalViewremoveGiftView=ll_gift_group.getChildAt(index);outAnim.setAnimationListener(newAnimation.AnimationListener(){@OverridepublicvoidonAnimationStart(Animationanimation){}@OverridepublicvoidonAnimationRepeat(Animationanimation){}@OverridepublicvoidonAnimationEnd(Animationanimation){ll_gift_group.removeViewAt(index);}});//开启动画,因为定时原因,所以可能是在子线程getActivity().runOnUiThread(newRunnable(){@Overridepublicvoidrun(){removeGiftView.startAnimation(outAnim);}});}

如果显示的礼物大于3种,就将最早的那种礼物移除:

//是否有该tag类型的礼物if(newGiftView==null){//判断礼物列表是否已经有3个了,如果有那么删除掉一个没更新过的,然后再添加新进来的礼物,始终保持只有3个if(ll_gift_group.getChildCount()>=3){//获取前2个元素的最后更新时间ViewgiftView01=ll_gift_group.getChildAt(0);ImageViewiv_gift01=giftView01.findViewById(R.id.iv_gift);longlastTime1=(long)iv_gift01.getTag();ViewgiftView02=ll_gift_group.getChildAt(1);ImageViewiv_gift02=giftView02.findViewById(R.id.iv_gift);longlastTime2=(long)iv_gift02.getTag();if(lastTime1>lastTime2){//如果第二个View显示的时间比较长removeGiftView(1);}else{//如果第一个View显示的时间长removeGiftView(0);}}...

开启定时清理礼物列表

礼物显示超过一定时间,自动将礼物在礼物列表中移除:

/***定时清理礼物列表信息*/privatevoidclearTiming(){Timertimer=newTimer();timer.schedule(newTimerTask(){@Overridepublicvoidrun(){intchildCount=ll_gift_group.getChildCount();longnowTime=System.currentTimeMillis();for(inti=0;i<childCount;i++){ViewchildView=ll_gift_group.getChildAt(i);ImageViewiv_gift=(ImageView)childView.findViewById(R.id.iv_gift);longlastUpdateTime=(long)iv_gift.getTag();//更新超过3秒就刷新if(nowTime-lastUpdateTime>=3000){removeGiftView(i);}}}},0,3000);}

Android如何实现仿直播类app赠送礼物功能

聊天实现

Android如何实现仿直播类app赠送礼物功能

caseR.id.tv_chat://聊天tv_chat.setVisibility(View.GONE);ll_inputparent.setVisibility(View.VISIBLE);ll_inputparent.requestFocus();//获取焦点showKeyboard();break;caseR.id.tv_send://发送消息StringchatMsg=et_chat.getText().toString();if(!TextUtils.isEmpty(chatMsg)){messageData.add("小明:"+chatMsg);et_chat.setText("");messageAdapter.NotifyAdapter(messageData);lv_message.setSelection(messageData.size());}hideKeyboard();break;/***显示软键盘*/privatevoidshowKeyboard(){InputMethodManagerimm=(InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);imm.showSoftInput(et_chat,InputMethodManager.SHOW_FORCED);}/***隐藏软键盘*/publicvoidhideKeyboard(){InputMethodManagerimm=(InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(et_chat.getWindowToken(),0);}view.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){if(ll_inputparent.getVisibility()==View.VISIBLE){tv_chat.setVisibility(View.VISIBLE);ll_inputparent.setVisibility(View.GONE);hideKeyboard();}}});//软键盘监听SoftKeyBoardListener.setListener(getActivity(),newSoftKeyBoardListener.OnSoftKeyBoardChangeListener(){@OverridepublicvoidkeyBoardShow(intheight){/*软键盘显示:执行隐藏title动画,并修改listview高度和装载礼物容器的高度*///输入文字时的界面退出动画AnimatorSetanimatorSetHide=newAnimatorSet();ObjectAnimatorleftOutAnim=ObjectAnimator.ofFloat(rl_num,"translationX",0,-rl_num.getWidth());ObjectAnimatortopOutAnim=ObjectAnimator.ofFloat(ll_anchor,"translationY",0,-ll_anchor.getHeight());animatorSetHide.playTogether(leftOutAnim,topOutAnim);animatorSetHide.setDuration(300);animatorSetHide.start();//改变listview的高度dynamicChangeListviewH(90);dynamicChangeGiftParentH(true);}@OverridepublicvoidkeyBoardHide(intheight){/*软键盘隐藏:隐藏聊天输入框并显示聊天按钮,执行显示title动画,并修改listview高度和装载礼物容器的高度*/tv_chat.setVisibility(View.VISIBLE);ll_inputparent.setVisibility(View.GONE);//输入文字时的界面进入时的动画AnimatorSetanimatorSetShow=newAnimatorSet();ObjectAnimatorleftInAnim=ObjectAnimator.ofFloat(rl_num,"translationX",-rl_num.getWidth(),0);ObjectAnimatortopInAnim=ObjectAnimator.ofFloat(ll_anchor,"translationY",-ll_anchor.getHeight(),0);animatorSetShow.playTogether(leftInAnim,topInAnim);animatorSetShow.setDuration(300);animatorSetShow.start();//改变listview的高度dynamicChangeListviewH(150);dynamicChangeGiftParentH(false);}});/***动态的修改listview的高度*/privatevoiddynamicChangeListviewH(intheightPX){ViewGroup.LayoutParamslayoutParams=lv_message.getLayoutParams();layoutParams.height=DisplayUtil.dip2px(getActivity(),heightPX);lv_message.setLayoutParams(layoutParams);}/***动态修改礼物父布局的高度*/privatevoiddynamicChangeGiftParentH(booleanshowhide){if(showhide){//如果软键盘显示中if(ll_gift_group.getChildCount()!=0){//判断是否有礼物显示,如果有就修改父布局高度,如果没有就不作任何操作ViewGroup.LayoutParamslayoutParams=ll_gift_group.getLayoutParams();layoutParams.height=ll_gift_group.getChildAt(0).getHeight();ll_gift_group.setLayoutParams(layoutParams);}}else{//如果软键盘隐藏中//就将装载礼物的容器的高度设置为包裹内容ViewGroup.LayoutParamslayoutParams=ll_gift_group.getLayoutParams();layoutParams.height=ViewGroup.LayoutParams.WRAP_CONTENT;ll_gift_group.setLayoutParams(layoutParams);}}

MagicTextView代码

/***该自定义view是用于显示礼物数字的,加了些效果,内发光,阴影等*/publicclassMagicTextViewextendsTextView{privateArrayList<Shadow>outerShadows;privateArrayList<Shadow>innerShadows;privateWeakHashMap<String,Pair<Canvas,Bitmap>>canvasStore;privateCanvastempCanvas;privateBitmaptempBitmap;privateDrawableforegroundDrawable;privatefloatstrokeWidth;privateIntegerstrokeColor;privateJoinstrokeJoin;privatefloatstrokeMiter;privateint[]lockedCompoundPadding;privatebooleanfrozen=false;publicMagicTextView(Contextcontext){super(context);init(null);}publicMagicTextView(Contextcontext,AttributeSetattrs){super(context,attrs);init(attrs);}publicMagicTextView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);init(attrs);}publicvoidinit(AttributeSetattrs){outerShadows=newArrayList<Shadow>();innerShadows=newArrayList<Shadow>();if(canvasStore==null){canvasStore=newWeakHashMap<String,Pair<Canvas,Bitmap>>();}if(attrs!=null){TypedArraya=getContext().obtainStyledAttributes(attrs,R.styleable.MagicTextView);StringtypefaceName=a.getString(R.styleable.MagicTextView_typeface);if(typefaceName!=null){Typefacetf=Typeface.createFromAsset(getContext().getAssets(),String.format("fonts/%s.ttf",typefaceName));setTypeface(tf);}if(a.hasValue(R.styleable.MagicTextView_foreground)){Drawableforeground=a.getDrawable(R.styleable.MagicTextView_foreground);if(foreground!=null){this.setForegroundDrawable(foreground);}else{this.setTextColor(a.getColor(R.styleable.MagicTextView_foreground,0xff000000));}}if(a.hasValue(R.styleable.MagicTextView_innerShadowColor)){this.addInnerShadow(a.getFloat(R.styleable.MagicTextView_innerShadowRadius,0),a.getFloat(R.styleable.MagicTextView_innerShadowDx,0),a.getFloat(R.styleable.MagicTextView_innerShadowDy,0),a.getColor(R.styleable.MagicTextView_innerShadowColor,0xff000000));}if(a.hasValue(R.styleable.MagicTextView_outerShadowColor)){this.addOuterShadow(a.getFloat(R.styleable.MagicTextView_outerShadowRadius,0),a.getFloat(R.styleable.MagicTextView_outerShadowDx,0),a.getFloat(R.styleable.MagicTextView_outerShadowDy,0),a.getColor(R.styleable.MagicTextView_outerShadowColor,0xff000000));}if(a.hasValue(R.styleable.MagicTextView_strokeColor)){floatstrokeWidth=a.getFloat(R.styleable.MagicTextView_strokeWidth,1);intstrokeColor=a.getColor(R.styleable.MagicTextView_strokeColor,0xff000000);floatstrokeMiter=a.getFloat(R.styleable.MagicTextView_strokeMiter,10);JoinstrokeJoin=null;switch(a.getInt(R.styleable.MagicTextView_strokeJoinStyle,0)){case(0):strokeJoin=Join.MITER;break;case(1):strokeJoin=Join.BEVEL;break;case(2):strokeJoin=Join.ROUND;break;}this.setStroke(strokeWidth,strokeColor,strokeJoin,strokeMiter);}}}publicvoidsetStroke(floatwidth,intcolor,Joinjoin,floatmiter){strokeWidth=width;strokeColor=color;strokeJoin=join;strokeMiter=miter;}publicvoidsetStroke(floatwidth,intcolor){setStroke(width,color,Join.MITER,10);}publicvoidaddOuterShadow(floatr,floatdx,floatdy,intcolor){if(r==0){r=0.0001f;}outerShadows.add(newShadow(r,dx,dy,color));}publicvoidaddInnerShadow(floatr,floatdx,floatdy,intcolor){if(r==0){r=0.0001f;}innerShadows.add(newShadow(r,dx,dy,color));}publicvoidclearInnerShadows(){innerShadows.clear();}publicvoidclearOuterShadows(){outerShadows.clear();}publicvoidsetForegroundDrawable(Drawabled){this.foregroundDrawable=d;}publicDrawablegetForeground(){returnthis.foregroundDrawable==null?this.foregroundDrawable:newColorDrawable(this.getCurrentTextColor());}@OverridepublicvoidonDraw(Canvascanvas){super.onDraw(canvas);freeze();DrawablerestoreBackground=this.getBackground();Drawable[]restoreDrawables=this.getCompoundDrawables();intrestoreColor=this.getCurrentTextColor();this.setCompoundDrawables(null,null,null,null);for(Shadowshadow:outerShadows){this.setShadowLayer(shadow.r,shadow.dx,shadow.dy,shadow.color);super.onDraw(canvas);}this.setShadowLayer(0,0,0,0);this.setTextColor(restoreColor);if(this.foregroundDrawable!=null&&this.foregroundDrawableinstanceofBitmapDrawable){generateTempCanvas();super.onDraw(tempCanvas);Paintpaint=((BitmapDrawable)this.foregroundDrawable).getPaint();paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));this.foregroundDrawable.setBounds(canvas.getClipBounds());this.foregroundDrawable.draw(tempCanvas);canvas.drawBitmap(tempBitmap,0,0,null);tempCanvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);}if(strokeColor!=null){TextPaintpaint=this.getPaint();//paint.setTextAlign(Paint.Align.CENTER);paint.setStyle(Style.STROKE);paint.setStrokeJoin(strokeJoin);paint.setStrokeMiter(strokeMiter);this.setTextColor(strokeColor);paint.setStrokeWidth(strokeWidth);super.onDraw(canvas);paint.setStyle(Style.FILL);this.setTextColor(restoreColor);}if(innerShadows.size()>0){generateTempCanvas();TextPaintpaint=this.getPaint();for(Shadowshadow:innerShadows){this.setTextColor(shadow.color);super.onDraw(tempCanvas);this.setTextColor(0xFF000000);paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.DST_OUT));paint.setMaskFilter(newBlurMaskFilter(shadow.r,BlurMaskFilter.Blur.NORMAL));tempCanvas.save();tempCanvas.translate(shadow.dx,shadow.dy);super.onDraw(tempCanvas);tempCanvas.restore();canvas.drawBitmap(tempBitmap,0,0,null);tempCanvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);paint.setXfermode(null);paint.setMaskFilter(null);this.setTextColor(restoreColor);this.setShadowLayer(0,0,0,0);}}if(restoreDrawables!=null){this.setCompoundDrawablesWithIntrinsicBounds(restoreDrawables[0],restoreDrawables[1],restoreDrawables[2],restoreDrawables[3]);}this.setBackgroundDrawable(restoreBackground);this.setTextColor(restoreColor);unfreeze();}privatevoidgenerateTempCanvas(){Stringkey=String.format("%dx%d",getWidth(),getHeight());Pair<Canvas,Bitmap>stored=canvasStore.get(key);if(stored!=null){tempCanvas=stored.first;tempBitmap=stored.second;}else{tempCanvas=newCanvas();tempBitmap=Bitmap.createBitmap(getWidth(),getHeight(),Bitmap.Config.ARGB_8888);tempCanvas.setBitmap(tempBitmap);canvasStore.put(key,newPair<Canvas,Bitmap>(tempCanvas,tempBitmap));}}publicvoidfreeze(){lockedCompoundPadding=newint[]{getCompoundPaddingLeft(),getCompoundPaddingRight(),getCompoundPaddingTop(),getCompoundPaddingBottom()};frozen=true;}publicvoidunfreeze(){frozen=false;}@OverridepublicvoidrequestLayout(){if(!frozen)super.requestLayout();}@OverridepublicvoidpostInvalidate(){if(!frozen)super.postInvalidate();}@OverridepublicvoidpostInvalidate(intleft,inttop,intright,intbottom){if(!frozen)super.postInvalidate(left,top,right,bottom);}@Overridepublicvoidinvalidate(){if(!frozen)super.invalidate();}@Overridepublicvoidinvalidate(Rectrect){if(!frozen)super.invalidate(rect);}@Overridepublicvoidinvalidate(intl,intt,intr,intb){if(!frozen)super.invalidate(l,t,r,b);}@OverridepublicintgetCompoundPaddingLeft(){return!frozen?super.getCompoundPaddingLeft():lockedCompoundPadding[0];}@OverridepublicintgetCompoundPaddingRight(){return!frozen?super.getCompoundPaddingRight():lockedCompoundPadding[1];}@OverridepublicintgetCompoundPaddingTop(){return!frozen?super.getCompoundPaddingTop():lockedCompoundPadding[2];}@OverridepublicintgetCompoundPaddingBottom(){return!frozen?super.getCompoundPaddingBottom():lockedCompoundPadding[3];}publicstaticclassShadow{floatr;floatdx;floatdy;intcolor;publicShadow(floatr,floatdx,floatdy,intcolor){this.r=r;this.dx=dx;this.dy=dy;this.color=color;}}}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Android如何实现仿直播类app赠送礼物功能的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:android中九宫格可分页加载控件怎么用下一篇:

5 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18