android - 当我将视频播放到 Recyclerview 内的 VideoView 时,当我滚动时,它会在 x 轴上旋转
问题描述
我有一个问题。我在recyclerview中放置了一个videoview,当我在手机中查看它时,视频的效果非常罕见,有时当我向下滚动时它会在x轴上旋转260°,但我也有imageview,它工作正常。
抱歉,我是 android 新手,我在互联网上搜索信息,但我找不到答案
卡xml代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView android:id="@+id/cvManana"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
card_view:cardCornerRadius="4dp"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/tools"
app:ignore="NamespaceTypo">
<LinearLayout android:background="@drawable/textlines"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:orientation="vertical"
android:id="@+id/post"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/imgPerfil"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:layout_marginRight="8dp"
android:scaleType="centerCrop"
android:src="@mipmap/ic_load_img" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_fechaPost"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="hace 44 minutos sep. 22º 16"
android:textColor="@color/defecto_text_fecha" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_nickname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="12dp"
android:text="User"
android:textColor="@color/defecto_main_text_nick"
android:textSize="16dp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/contentTextStory"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_postTimeLine"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:text="historias"
android:textColor="@color/defecto_color_text_tabla"
android:textSize="17dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/defecto_color_text_tabla"
android:gravity="center_horizontal"
android:id="@+id/contentFiles">
<ImageView
android:id="@+id/image_timeline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:cropToPadding="false"
android:scaleType="fitStart"
card_view:srcCompat="@drawable/campo_manana" />
<VideoView
android:id="@+id/video_timeline"
android:layout_width="match_parent"
android:layout_height="450dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_centerInParent="true"
app:layout_constraintTop_toTopOf="parent"
android:layout_weight="1" />
</LinearLayout>
<LinearLayout
android:paddingTop="4dp"
android:paddingBottom="7dp"
android:layout_gravity="left"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:gravity="right"
android:layout_weight="1.0"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/bt_reply"
android:layout_gravity="center_vertical"
android:scaleType="centerCrop"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@mipmap/ic_reply_gray"/>
<TextView
android:id="@+id/countReply"
android:text="(3)"
android:textSize="12dp"
android:layout_gravity="center"
android:textColor="#999"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_weight="1.0"
android:layout_width="match_parent"
android:gravity="right"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/bt_share"
android:scaleType="centerCrop"
android:layout_gravity="center_vertical"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@mipmap/ic_share_gray"/>
<TextView
android:id="@+id/countShare"
android:text="(3)"
android:textSize="12dp"
android:layout_gravity="center"
android:textColor="#999"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_weight="1.0"
android:layout_width="match_parent"
android:gravity="right"
android:layout_height="wrap_content">
<ImageButton
android:layout_gravity="center_vertical"
android:id="@+id/bt_like"
android:scaleType="centerCrop"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@mipmap/ic_like_gray"/>
<TextView
android:id="@+id/countLike"
android:text="(3)"
android:textSize="12dp"
android:layout_gravity="center"
android:textColor="#999"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_weight="1.0"
android:layout_width="match_parent"
android:gravity="right"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/bt_dislike"
android:layout_gravity="center_vertical"
android:scaleType="centerCrop"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@mipmap/ic_nolike_gray"/>
<TextView
android:id="@+id/countNoLike"
android:text="(3)"
android:textSize="12dp"
android:layout_gravity="center"
android:textColor="#999"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
recyclerview的Java代码
postViewHolder.imgTimeLine.setVisibility(View.VISIBLE);
postViewHolder.videoTm.setVisibility(View.VISIBLE);
if(!fileson.getBoolean("err")){ // si tiene archivos adjuntos
switch (fileson.getString("type")){
case "Pic":
imageTimeline imgTm=new imageTimeline(fileson.getString("src"), postViewHolder.imgTimeLine);
imgTm.execute();
postViewHolder.videoTm.setVisibility(View.GONE);
break;
case "vid":
postViewHolder.videoTm.setVideoURI(Uri.parse(fileson.getString("src")));
MediaController mediaController = new MediaController(ctx);
postViewHolder.videoTm.setMediaController(mediaController);
postViewHolder.videoTm.requestFocus();
mediaController.setAnchorView(postViewHolder.itemView);
//postViewHolder.videoTm.start();
postViewHolder.imgTimeLine.setVisibility(View.GONE);
break;
default:
postViewHolder.imgTimeLine.setVisibility(View.GONE);
postViewHolder.videoTm.setVisibility(View.GONE);
break;
}
}else{
postViewHolder.imgTimeLine.setVisibility(View.GONE);
postViewHolder.videoTm.setVisibility(View.GONE);
}
可视化
编辑 ******************
我更新了 gradle 并使用了androidx资源并改变了我的代码中的所有内容,但我可以解决所有这些问题......除了一个。该代码可以在我的设备中安装,但是当我尝试运行它时,显示在run console
此错误中
home.java 代码
// imports header
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
// end imports header
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
fnFiles.createFoldersNecesary(this);
sockets.getmSocket();
sockets.getnSocket();
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
sql.abrir();
final JSONObject rows = sql.readLogin();
sql.cerrar();
try {
if(rows.getString("nick")!=""){
rowss=rows;
startDesign(rows);
} else {
Intent intent = new Intent(home.this, login.class);
startActivity(intent);
}
} catch (JSONException e) {
e.printStackTrace();
}
FloatingActionButton fab=findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(home.this, newHistoryPop.class));
}
});
DrawerLayout drawer = findViewById(R.id.drawer_layout);
//ActionBarDrawerToggle toggle=new ActionBarDrawerToggle(this, );
//ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
// this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
//drawer.setDrawerListener((DrawerLayout.DrawerListener) toggle);
//toggle.syncState();
NavigationView navigationView = findViewById(R.id.nav_view_left);
navigationView.setNavigationItemSelectedListener(this);
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}
解决方案
为了找到解决您问题的方法,我最终重新创建了您的项目。仍然不确定为什么您的 videoView 不起作用。我认为这要么与使用支持库有关,要么与您在 recyclerView 中隐藏/显示视图的逻辑有关。
- 我建议远离支持库,即
android.support.v7.widget.CardView
它们不再受支持并且已知存在错误并迁移到 androidxandroidx.cardview.widget.CardView
。
这是我onBindViewHolder
的 recyclerView 适配器
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final CardView cd = holder.card;
final LinearLayout postCard = holder.postCard;
final ImageView imageView = holder.imageTime;
final VideoView videoTime = holder.videoTime;
// Hide both image and video views
imageView.setVisibility(View.GONE);
videoTime.setVisibility(View.GONE);
videoTime.stopPlayback(); // stop play back if view has been reused
/*
Demo media Urls contains mp4 and jpg
List<String> mediaUrls = Arrays.asList("https://funnymemes.funnyjunk.com/movies/Meme_042a09_6211432.mp4",
"https://memeworld.funnyjunk.com/pictures/Avaricious+preparatory+mitigated+kingfisher_c80ce6_7780034.jpg",
"https://funnymemes.funnyjunk.com/movies/Meme_7a7f88_6211432.mp4");
*/
// returns string used to distinguish the type of media (mp4,jpg)
String mediaType = mediaUrls.get(position).substring(mediaUrls.get(position).length() - 3); // return last three chars from the url
switch (mediaType) {
case "mp4":
videoTime.setVisibility(View.VISIBLE);
Uri video = Uri.parse(mediaUrls.get(position));
videoTime.setVideoURI(video);
videoTime.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.setLooping(true);
videoTime.start();
}
});
break;
case "jpg":
imageView.setVisibility(View.VISIBLE);
// use picasso for async request for images
Picasso.get()
.load(mediaUrls.get(position))
.error(R.drawable.ic_image)
.into(imageView);
break;
default:
Log.e("Unknown Media Type ",mediaType);
break;
}
}
然后不要忘记将库添加到 Project Gradle。
implementation 'com.squareup.picasso:picasso:2.71828'
implementation "androidx.recyclerview:recyclerview:1.1.0"
implementation 'androidx.cardview:cardview:1.0.0'
推荐阅读
- c - 为什么这个 C/C++ 代码有助于快速输入
- c++ - 不允许不完整的类型(c++ VSCODE)
- arrays - 如何摆脱 Excel 中数组中的错误?ISERROR 和 IFERROR 不起作用
- alfresco - 如何在露天安装模块?
- tfs - TFS 2018 - 错误 MSB1008(使用 VS 构建)
- python - Python:查找x第一次出现的索引,然后是x第二次出现的索引
- bash - 如何将一个文件的行写入自己目录中的单个文件?
- ajax - 子组件中的 Await 调用会阻塞父渲染吗?
- visual-studio-2017 - Visual Studio 2017 Intellisense 与 reactjs .js 文件中的 HTML
- javascript - 如何使数组映射迭代同步?