<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:id="@+id/gsy" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ImageView android:id="@+id/iv_rotate" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentEnd="true" android:layout_alignParentBottom="true" android:layout_marginBottom="20dp" android:layout_marginEnd="20dp" android:src="@mipmap/ic_launcher"/> <TextView android:layout_alignBottom="@+id/iv_rotate" android:layout_alignRight="@+id/iv_rotate" android:layout_marginBottom="50dp" android:layout_marginEnd="3dp" android:id="@+id/tv_share" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1.2万" android:textColor="@color/white" android:textSize="15sp"/> <ImageView android:src="@mipmap/ic_launcher" android:id="@+id/iv_share" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignBottom="@+id/tv_share" android:layout_alignRight="@+id/tv_share" android:layout_marginBottom="30dp" android:layout_marginEnd="3dp"/> <TextView android:id="@+id/tv_collect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1.8万" android:textColor="@color/white" android:textSize="15sp" android:layout_alignBottom="@+id/iv_share" android:layout_alignRight="@+id/tv_share" android:layout_marginBottom="40dp" /> <ImageView android:id="@+id/iv_collect" android:layout_width="30dp" android:layout_height="30dp" android:src="@mipmap/ic_launcher" android:layout_alignBottom="@+id/tv_collect" android:layout_alignRight="@+id/tv_collect" android:layout_marginBottom="30dp" android:layout_marginEnd="3dp"/> <TextView android:id="@+id/tv_comment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2.0万" android:textColor="@color/white" android:textSize="15sp" android:layout_alignBottom="@+id/iv_collect" android:layout_alignRight="@+id/tv_share" android:layout_marginBottom="40dp" /> <ImageView android:id="@+id/iv_comment" android:layout_width="30dp" android:layout_height="30dp" android:src="@mipmap/ic_launcher" android:layout_alignBottom="@+id/tv_comment" android:layout_alignRight="@+id/tv_comment" android:layout_marginBottom="30dp" android:layout_marginEnd="3dp"/> <TextView android:id="@+id/tv_like" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2.0万" android:textColor="@color/white" android:textSize="15sp" android:layout_alignBottom="@+id/iv_comment" android:layout_alignRight="@+id/tv_share" android:layout_marginBottom="40dp" /> <ImageView android:id="@+id/iv_like" android:layout_width="30dp" android:layout_height="30dp" android:src="@mipmap/ic_launcher" android:layout_alignBottom="@+id/tv_like" android:layout_alignRight="@+id/tv_like" android:layout_marginBottom="30dp" android:layout_marginEnd="3dp" /> <ImageView android:id="@+id/iv_head" android:layout_width="30dp" android:layout_height="30dp" android:src="@drawable/ic_mine" android:layout_alignBottom="@+id/iv_like" android:layout_alignRight="@+id/iv_like" android:layout_marginBottom="50dp"/> <ImageView android:id="@+id/iv_focus" android:layout_width="20dp" android:layout_height="20dp" android:src="@mipmap/ic_launcher" android:layout_alignTop="@+id/iv_head" android:layout_alignRight="@+id/iv_head" android:layout_marginEnd="4dp" android:layout_marginTop="20dp"/> <TextView android:layout_width="150dp" android:layout_height="wrap_content" android:id="@+id/tv_marquee" android:text="阿斯顿建瓯哇" android:singleLine="true" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:marqueeRepeatLimit="marquee_forever" android:textSize="15sp" android:textColor="@color/white" android:layout_alignParentBottom="true" android:layout_marginStart="20dp" android:layout_marginBottom="20dp"/> <TextView android:id="@+id/tv_caption" android:layout_width="200dp" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:text="发发发" android:textColor="@color/white" android:layout_alignBottom="@+id/tv_marquee" android:layout_marginBottom="20dp" android:layout_marginStart="20dp"/> <TextView android:id="@+id/tv_user" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="顶顶顶" android:textSize="20sp" android:textColor="@color/white" android:layout_alignBottom="@+id/tv_caption" android:layout_marginBottom="20dp" android:layout_marginStart="20dp"/> <ImageView android:id="@+id/iv_locate" android:layout_width="30dp" android:layout_height="30dp" android:src="@mipmap/ic_launcher" android:layout_alignBottom="@+id/tv_user" android:layout_marginBottom="30dp" android:layout_marginStart="20dp"/> <TextView android:id="@+id/tv_locate" android:text="1231231" android:textColor="@color/white" android:layout_alignLeft="@+id/iv_locate" android:layout_alignTop="@+id/iv_locate" android:layout_marginTop="5dp" android:layout_marginStart="30dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <LinearLayout android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:id="@+id/iv_full" android:src="@mipmap/ic_launcher" android:layout_width="30dp" android:layout_height="30dp"/> <TextView android:text="全屏播放" android:textSize="20sp" android:textColor="@color/white" android:layout_marginStart="10dp" app:layout_constraintLeft_toRightOf="@id/iv_full" app:layout_constraintTop_toTopOf="@id/iv_full" app:layout_constraintBottom_toBottomOf="@id/iv_full" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> <RelativeLayout android:id="@+id/cl_comment" android:layout_alignParentBottom="true" android:background="@color/white" android:layout_width="match_parent" android:layout_height="@dimen/dp_300"> <TextView android:id="@+id/tv_say" android:text="大家都来说说" android:layout_margin="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:text="不吃学习的苦,就吃生活的苦" android:textColor="@color/pink" android:layout_alignTop="@+id/tv_say" android:layout_alignLeft="@+id/tv_say" android:layout_marginStart="100dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <ImageView android:id="@+id/iv_close" android:src="@drawable/baseline_close_24" android:background="@drawable/shape_tuijian_add" android:layout_alignTop="@+id/tv_say" android:layout_alignParentRight="true" android:layout_marginEnd="30dp" android:layout_marginRight="@dimen/dp_20" android:layout_width="@dimen/dp_30" android:layout_height="@dimen/dp_30"/> <TextView android:id="@+id/tv_commentcount" android:text="40条评论" android:textColor="@color/pink" android:background="@drawable/shape_tuijian_dingwei" android:layout_alignTop="@+id/tv_say" android:layout_centerHorizontal="true" android:layout_marginTop="30dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_comment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignTop="@+id/tv_commentcount" android:layout_marginTop="20dp" android:layout_alignParentBottom="true" android:layout_marginBottom="60dp" /> <LinearLayout android:layout_alignParentBottom="true" android:id="@+id/cl_input_commet" app:layout_constraintBottom_toBottomOf="parent" android:background="@drawable/shape_tuijian_dingwei" android:layout_width="match_parent" android:layout_height="@dimen/dp_60"> <EditText android:id="@+id/et_input_commet" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent" android:layout_marginLeft="@dimen/dp_10" android:layout_width="@dimen/dp_300" android:layout_height="wrap_content"/> <ImageView android:layout_marginStart="20dp" android:layout_gravity="center_vertical" android:id="@+id/iv_send_commet" app:layout_constraintTop_toTopOf="parent" android:src="@drawable/baseline_send_24" android:layout_width="@dimen/dp_30" android:layout_height="@dimen/dp_30"/> </LinearLayout> </RelativeLayout> </RelativeLayout>
相对布局里的抖音控件以及抖音视频
package com.bw.zy3.Fragment; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.databinding.DataBindingUtil; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.BounceInterpolator; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.blankj.utilcode.util.SPUtils; import com.bw.zy3.Adapter.MyPlAdapter; import com.bw.zy3.Adapter.MyVideoAdapter; import com.bw.zy3.Entity.PlEntity; import com.bw.zy3.Entity.VideoEntity; import com.bw.zy3.R; import com.bw.zy3.UI.DouyinLinearLayoutManager; import com.bw.zy3.ViewModel.TuijianViewModel; import com.bw.zy3.databinding.FragmentABinding; import com.bw.zy3.databinding.FragmentCBinding; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.listener.OnItemChildClickListener; import com.google.gson.Gson; import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import okhttp3.MediaType; import okhttp3.RequestBody; public class TuijianFragment extends Fragment { FragmentCBinding binding; TuijianViewModel viewModel=new TuijianViewModel(); private List<VideoEntity.DataBean> list=new ArrayList<>(); private MyVideoAdapter adapter; private MyPlAdapter plAdapter; private List<PlEntity.DataBean> pllist=new ArrayList<>(); TextView tv_comment; public static TuijianFragment newInstance() { TuijianFragment fragment = new TuijianFragment(); Bundle args = new Bundle(); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment binding = DataBindingUtil.inflate(getLayoutInflater(),R.layout.fragment_c,container,false); adapter=new MyVideoAdapter(); DouyinLinearLayoutManager douyinLinearLayoutManager=new DouyinLinearLayoutManager(getActivity()); binding.rv.setLayoutManager(douyinLinearLayoutManager); binding.rv.setAdapter(adapter); viewModel.getVideoData(15,10); viewModel.liveData.observe(getActivity(), videoEntity -> { if (videoEntity.getCode()==200){ list.addAll(videoEntity.getData()); adapter.getData().addAll(list); adapter.notifyDataSetChanged(); } }); binding.rv.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> { int firstVisibleitemPosition=douyinLinearLayoutManager.findFirstVisibleItemPosition(); StandardGSYVideoPlayer standardGSYVideoPlayer= (StandardGSYVideoPlayer) adapter.getViewByPosition(firstVisibleitemPosition,R.id.gsy); standardGSYVideoPlayer.startPlayLogic(); }); adapter.addChildClickViewIds(R.id.iv_focus,R.id.iv_like,R.id.iv_comment,R.id.iv_collect,R.id.iv_share,R.id.iv_close,R.id.iv_send); adapter.setOnItemChildClickListener(new OnItemChildClickListener() { @Override public void onItemChildClick(@NonNull BaseQuickAdapter adapter, @NonNull View view, int position) { switch (view.getId()){ //关注 case R.id.iv_focus: focus(position); break; //点赞 case R.id.iv_like: like(position); break; case R.id.iv_comment: comment(position); break; case R.id.iv_close: close(position); break; case R.id.iv_send: sendcomment(position); break; case R.id.iv_collect: break; case R.id.iv_share: break; } } }); return binding.getRoot(); } private void sendcomment(int position) { EditText rd_plcontent= (EditText) adapter.getViewByPosition(position,R.id.ed_pl_content); String msg = rd_plcontent.getText().toString(); int id = adapter.getData().get(position).getId(); if (!TextUtils.isEmpty(msg)) { Map<String,Object> map=new HashMap<>(); map.put("msg",msg); map.put("videoId",id); String json=new Gson().toJson(map); RequestBody requestBody=RequestBody.create(MediaType.parse("application/json;charset=utf-8"),json); viewModel.getSendPl(requestBody); rd_plcontent.setText(""); } //置顶功能 PlEntity.DataBean dataBean=new PlEntity.DataBean(); dataBean.setMsg(msg); dataBean.setIcon(SPUtils.getInstance().getString("icon")); dataBean.setUsername(SPUtils.getInstance().getString("username")); plAdapter.getData().add(dataBean); plAdapter.addData(0,dataBean); plAdapter.notifyDataSetChanged(); viewModel.liveData6.observe(this, plEntity -> { if (plEntity.getCode()==200){ Toast.makeText(getActivity(), "发表评论成功", Toast.LENGTH_SHORT).show(); } }); } private void close(int position) { //隐藏评论 ConstraintLayout constraintLayout = (ConstraintLayout) adapter.getViewByPosition(position,R.id.pl); constraintLayout.setVisibility(View.GONE); //动画 Animation animation= AnimationUtils.loadAnimation(getActivity(),R.anim.out); animation.setInterpolator(new BounceInterpolator()); constraintLayout.startAnimation(animation); } private void comment(int position) { //点击显示评论 ConstraintLayout constraintLayout= (ConstraintLayout) adapter.getViewByPosition(position,R.id.pl); constraintLayout.setVisibility(View.VISIBLE); //动画 Animation animation=AnimationUtils.loadAnimation(getActivity(),R.anim.in); animation.setInterpolator(new BounceInterpolator()); constraintLayout.startAnimation(animation); int id = adapter.getData().get(position).getId(); viewModel.getPl(id); plAdapter=new MyPlAdapter(R.layout.item_comment); RecyclerView rv_pl= (RecyclerView) adapter.getViewByPosition(position,R.id.rv_pl); rv_pl.setLayoutManager(new LinearLayoutManager(getActivity())); rv_pl.setAdapter(plAdapter); tv_comment= (TextView) adapter.getViewByPosition(position,R.id.tv_comment); viewModel.liveData5.observe(this, plEntity -> { if (plEntity.getCode()==200){ pllist.clear(); plAdapter.getData().clear(); pllist.addAll(plEntity.getData()); plAdapter.getData().addAll(pllist); tv_comment.setText(plEntity.getData().size()+"条评论"); plAdapter.notifyDataSetChanged(); } }); } private void like(int position) { VideoEntity.DataBean dataBean = adapter.getData().get(position); int id = dataBean.getId(); //图片 ImageView iv_like= (ImageView) adapter.getViewByPosition(position,R.id.iv_like); TextView tv_like= (TextView) adapter.getViewByPosition(position,R.id.tv_like); if (dataBean.getDianzan()==0){ viewModel.getlike(id); iv_like.setImageResource(R.drawable.baseline_favorite_24); //缩放动画 ObjectAnimator scaleX=ObjectAnimator.ofFloat(iv_like,"scaleX",1,2,1); ObjectAnimator scaleY=ObjectAnimator.ofFloat(iv_like,"scaleY",1,2,1); AnimatorSet animatorSet=new AnimatorSet(); animatorSet.setDuration(2000); animatorSet.play(scaleX).with(scaleY); animatorSet.start(); //文字 int like_count = dataBean.getLike_count(); like_count++; dataBean.setLike_count(like_count); tv_like.setText(like_count+""); dataBean.setDianzan(1); viewModel.liveData3.observe(this, resultEntity -> { if (resultEntity.getCode()==200){ Toast.makeText(getActivity(), "点赞成功", Toast.LENGTH_SHORT).show(); } }); }else { viewModel.getnolike(position); int like_count = dataBean.getLike_count(); like_count--; dataBean.setLike_count(like_count); tv_like.setText(like_count+""); iv_like.setImageResource(R.drawable.baseline_favorite_border_24); dataBean.setDianzan(0); viewModel.liveData4.observe(this, resultEntity -> { if (resultEntity.getCode()==200){ Toast.makeText(getActivity(), "取消点赞成功", Toast.LENGTH_SHORT).show(); } }); } } private void focus(int position) { VideoEntity.DataBean dataBean = adapter.getData().get(position); String authname=dataBean.getAuthname(); Map<String,String> map=new HashMap<>(); map.put("authname",authname); String json=new Gson().toJson(map); RequestBody requestBody=RequestBody.create(MediaType.parse("application/json;charset=utf-8"),json); ImageView iv_focus= (ImageView) adapter.getViewByPosition(position,R.id.iv_focus); if (dataBean.getGuanzhu()==0){ viewModel.getFocus(requestBody); //图片 iv_focus.setImageResource(R.drawable.baseline_check_24); iv_focus.setBackground(getContext().getDrawable(R.drawable.shape_tuijian_quan_jin)); //动画 ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(iv_focus,"alpha",1,0); objectAnimator.setDuration(2000); objectAnimator.start(); dataBean.setGuanzhu(1); viewModel.liveData1.observe(this, resultEntity -> { if (resultEntity.getCode()==200) { Toast.makeText(getActivity(), "关注成功", Toast.LENGTH_SHORT).show(); } }); }else { viewModel.getNofocus(requestBody); //图片 iv_focus.setImageResource(R.drawable.baseline_add_circle_outline_24); iv_focus.setBackground(getContext().getDrawable(R.drawable.shape_tuijian_add)); //动画 ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(iv_focus,"alpha",0,1); objectAnimator.setDuration(2000); objectAnimator.start(); dataBean.setGuanzhu(0); viewModel.liveData2.observe(this, resultEntity -> { if (resultEntity.getCode()==200){ Toast.makeText(getActivity(), "取消关注成功", Toast.LENGTH_SHORT).show(); } }); } } }
//评论以及抖音点赞主页面布局等等