实时视频优化,延时解决不稳定的bug

yt_mpremote
liuguijing 2 months ago
parent bdb4726f55
commit f30825c20b

@ -28,6 +28,7 @@ import com.xypower.mpremote.databinding.ActivityDeviceBinding;
import com.xypower.mpremote.interfaces.OnItemClickListener;
import com.xypower.mpremote.utils.AdbUtils;
import com.xypower.mpremote.utils.AlertDialogUtils;
import com.xypower.mpremote.utils.AppUtils;
import com.xypower.mpremote.utils.FileUtils;
import org.json.JSONObject;
@ -111,6 +112,9 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
}
private void initView() {
String versionName = AppUtils.getAppNameWithVersion(this);
binding.toolbar.title.setText(versionName);
photoitemAdapter = new ItemAdapter();
photoitemAdapter.setAdapterType(photoAdapter);
photoitemAdapter.setOnClickListener(this);
@ -124,14 +128,9 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
binding.recyclerViewVideo.setLayoutManager(new GridLayoutManager(this, 3));
binding.ytControl.setOnClickListener(this);
binding.takePhoto1.setOnClickListener(this);
binding.takePhoto2.setOnClickListener(this);
binding.takePhoto3.setOnClickListener(this);
binding.takePhoto4.setOnClickListener(this);
binding.takeVideo1.setOnClickListener(this);
binding.takeVideo2.setOnClickListener(this);
binding.takeVideo3.setOnClickListener(this);
binding.takeVideo4.setOnClickListener(this);
binding.toolbar.back.setOnClickListener(this);
binding.toolbar.refresh.setVisibility(View.VISIBLE);
binding.toolbar.refresh.setOnClickListener(this);
}
private void initData() {
@ -189,6 +188,7 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
}
}
mChannelCfgs.clear();
channelList.clear();
if (mAppConfig != null && mAppConfig.channels > 0) {
for (int channel = 1; channel <= mAppConfig.channels; channel++) {
ChannelBean channelBean = new ChannelBean();
@ -519,25 +519,6 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
startActivity(intent);
}
private void updateButtons(int numberOfChannels) {
if (numberOfChannels > 0) {
binding.takePhoto1.setVisibility(View.VISIBLE);
binding.takeVideo1.setVisibility(View.VISIBLE);
}
if (numberOfChannels > 1) {
binding.takePhoto2.setVisibility(View.VISIBLE);
binding.takeVideo2.setVisibility(View.VISIBLE);
}
if (numberOfChannels > 2) {
binding.takePhoto3.setVisibility(View.VISIBLE);
binding.takeVideo3.setVisibility(View.VISIBLE);
}
if (numberOfChannels > 3) {
binding.takePhoto4.setVisibility(View.VISIBLE);
binding.takeVideo4.setVisibility(View.VISIBLE);
}
}
private void showStreaming(int channel, int cameraId, final String url, String localIp) {
int rotation = -1;
@ -695,6 +676,13 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back:
finish();
break;
case R.id.refresh:
loadDeviceInfo(false);
break;
}
}

@ -1,53 +1,25 @@
package com.xypower.mpremote;
import android.annotation.SuppressLint;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import com.xypower.mpremote.adapter.ImageItemAdapter;
import com.xypower.mpremote.adapter.ItemAdapter;
import com.xypower.mpremote.databinding.ActivityImageBinding;
import com.xypower.mpremote.utils.AppUtils;
import com.xypower.mpremote.utils.FileUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ImageActivity extends AppCompatActivity implements View.OnClickListener {
private String mSerialNo = "";
@ -76,22 +48,25 @@ public class ImageActivity extends AppCompatActivity implements View.OnClickList
}
private void initView() {
// binding.imageView.setImageDrawable(null);
// binding.imageView.setClickable(true);
// binding.imageView.setOnClickListener(this);
// if (path != null) {
// loadImage(path);
// }
String versionName = AppUtils.getAppNameWithVersion(this);
binding.toolbar.title.setText(versionName);
binding.toolbar.refresh.setVisibility(View.VISIBLE);
binding.toolbar.back.setOnClickListener(this);
binding.toolbar.refresh.setOnClickListener(this);
mAdapter = new ImageItemAdapter();
// mAdapter.setOnClickListener(this);
binding.recyclerView.setAdapter(mAdapter);
binding.recyclerView.setHasFixedSize(true);
binding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
}
private void initData() {
// 在Activity或Fragment中
// getPicList();
loadPhotos();
}
private void loadPhotos() {
List<String> imageFiles = FileUtils.getImageFiles(photodirpath);
mAdapter.setItemList(imageFiles);
}
@ -102,21 +77,12 @@ public class ImageActivity extends AppCompatActivity implements View.OnClickList
// String relativePath = Environment.DIRECTORY_PICTURES + "/" + Constants.PACKAGE_NAME_MPREMOTE + "/";
String relativePath = photodirpath;
String[] projection = {
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME
};
String[] projection = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME};
String selection = MediaStore.Images.Media.RELATIVE_PATH + " = ?";
String[] selectionArgs = new String[]{relativePath};
Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
null
);
Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null);
List<String> imageList = new ArrayList<>();
if (cursor != null) {
@ -126,8 +92,7 @@ public class ImageActivity extends AppCompatActivity implements View.OnClickList
while (cursor.moveToNext()) {
long id = cursor.getLong(idColumn);
String name = cursor.getString(nameColumn);
Uri contentUri = ContentUris.withAppendedId(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
Uri contentUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
imageList.add(name);
}
@ -137,40 +102,6 @@ public class ImageActivity extends AppCompatActivity implements View.OnClickList
Log.e("dfsdaf", imageList.toString());
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// binding.imageView.requestLayout();
}
// private boolean loadImage(String path) {
// binding.imageView.setImageDrawable(null);
// File file = new File(path);
// if (!file.exists()) {
// return false;
// }
// Drawable drawable = loadDrawable(path);
// if (drawable != null) {
// binding.imageView.setImageDrawable(drawable);
// }
// return drawable != null;
// }
private Drawable loadDrawable(String file) {
if (file == null || file.isEmpty()) {
return null;
}
Drawable drawable = null;
try {
Bitmap bitmap = BitmapFactory.decodeFile(file);
drawable = new BitmapDrawable(getResources(), bitmap);
} catch (Exception e) {
e.printStackTrace();
}
return drawable;
}
protected void loadAllImages() {
File localDevicePath = new File(getFilesDir(), "Photos" + File.separator + mSerialNo);
@ -185,6 +116,9 @@ public class ImageActivity extends AppCompatActivity implements View.OnClickList
case R.id.back:
finish();
break;
case R.id.refresh:
loadPhotos();
break;
}
}

@ -27,6 +27,7 @@ import android.util.Log;
import android.view.View;
import com.xypower.mpremote.databinding.ActivityMainBinding;
import com.xypower.mpremote.utils.AppUtils;
import java.util.ArrayList;
@ -73,6 +74,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickList
);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
String versionName = AppUtils.getAppNameWithVersion(this);
binding.toolbar.title.setText(versionName);
binding.toolbar.back.setVisibility(View.INVISIBLE);
binding.selectWifi.setOnClickListener(this);
binding.control.setOnClickListener(this);

@ -1,5 +1,6 @@
package com.xypower.mpremote;
import androidx.annotation.NonNull;
import androidx.annotation.OptIn;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
@ -19,9 +20,12 @@ import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.xypower.common.FilesUtils;
import com.xypower.mpremote.databinding.ActivityMainBinding;
import com.xypower.mpremote.databinding.ActivityStreamBinding;
import com.xypower.mpremote.utils.AdbUtils;
import com.xypower.mpremote.zlmediakit.ZLMediaKit;
@ -33,7 +37,7 @@ import dadb.AdbKeyPair;
import dadb.AdbShellResponse;
import dadb.Dadb;
public class StreamActivity extends AppCompatActivity {
public class StreamActivity extends AppCompatActivity implements View.OnClickListener {
// private PlayerView playerView;
private static final String TAG = "STRM";
@ -41,24 +45,30 @@ public class StreamActivity extends AppCompatActivity {
private ExoPlayer exoPlayer;
private String mDeviceIp;
private Handler mHandler;
@NonNull
private com.xypower.mpremote.databinding.ActivityStreamBinding binding;
private String localIp;
private int cameraId;
private int anInt;
private int rotation;
private int netCamera;
private int vendor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stream);
binding = ActivityStreamBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
mHandler = new Handler();
Intent intent = getIntent();
mDeviceIp = intent.getStringExtra("deviceIp");
String localIp = intent.getStringExtra("localIp");
int cameraId = intent.getIntExtra("cameraId", 0);
int channel = intent.getIntExtra("channel", 1);
int rotation = intent.getIntExtra("rotation", -1);
int netCamera = intent.getIntExtra("netCamera", 0);
int vendor = intent.getIntExtra("vendor", 0);
initHandler();
initIntent();
initView();
initEvent();
}
private void initEvent() {
String url = "rtmp://" + mDeviceIp + "/live/0";
String cmd = "am start -n com.xypower.mplive/com.xypower.mplive.MainActivity"
@ -68,17 +78,37 @@ public class StreamActivity extends AppCompatActivity {
+ " --ei vendor " + Integer.toString(vendor)
+ " --ei autoStart 1"
+ " --es url \"" + url + "\"";
Runnable runnable = new Runnable() {
@Override
public void run() {
initializePlayer();
}
};
startStreaming(cmd, runnable);
}
private void initHandler() {
mHandler = new Handler();
}
private void initIntent() {
Intent intent = getIntent();
mDeviceIp = intent.getStringExtra("deviceIp");
localIp = intent.getStringExtra("localIp");
cameraId = intent.getIntExtra("cameraId", 0);
anInt = intent.getIntExtra("channel", 1);
rotation = intent.getIntExtra("rotation", -1);
netCamera = intent.getIntExtra("netCamera", 0);
vendor = intent.getIntExtra("vendor", 0);
}
private void initView() {
binding.toolbar.refresh.setVisibility(View.VISIBLE);
binding.toolbar.back.setOnClickListener(this);
binding.toolbar.refresh.setOnClickListener(this);
}
private void startStreaming(final String cmd, final Runnable runnable) {
Log.d(TAG, cmd);
Thread th = new Thread(new Runnable() {
@ -119,12 +149,10 @@ public class StreamActivity extends AppCompatActivity {
if (adbShellResponse != null) {
if (adbShellResponse.getExitCode() == 0) {
try {
Thread.sleep(1000);
Thread.sleep(5000);
} catch (Exception ex) {
}
runOnUiThread(runnable);
}
}
@ -185,7 +213,6 @@ public class StreamActivity extends AppCompatActivity {
MediaItem mediaItem = MediaItem.fromUri("rtmp://" + mDeviceIp + "/live/0");
ProgressiveMediaSource videoSource = new ProgressiveMediaSource.Factory(new RtmpDataSource.Factory())
.createMediaSource(mediaItem);
exoPlayer.setMediaSource(videoSource);
exoPlayer.prepare();
exoPlayer.play();
@ -243,4 +270,15 @@ public class StreamActivity extends AppCompatActivity {
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back:
finish();
break;
case R.id.refresh:
initEvent();
break;
}
}
}

@ -17,7 +17,7 @@ public class AlertDialogUtils {
TextView viewById = dialogView.findViewById(R.id.tvLoading);
viewById.setText(hint);
builder.setView(dialogView);
builder.setCancelable(false); // 是否允许用户取消
builder.setCancelable(true); // 是否允许用户取消
AlertDialog loadingDialog = builder.create();
loadingDialog.show();
return loadingDialog;

@ -0,0 +1,41 @@
package com.xypower.mpremote.utils;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import com.xypower.mpremote.R;
public class AppUtils {
/**
*
* @param context
* @return "1.0.0"
*/
public static String getVersionName(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0);
return packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return null;
}
}
/**
*
* @param context
* @return "我的App v1.0.0"
*/
public static String getAppNameWithVersion(Context context) {
try {
String appName = context.getString(R.string.app_name); // 从strings.xml获取
String versionName = getVersionName(context);
return String.format("%s v%s", appName, versionName);
} catch (Exception e) {
return context.getString(R.string.app_name);
}
}
}

@ -11,6 +11,9 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class FileUtils {
@ -35,30 +38,38 @@ public class FileUtils {
/**
*
*
* @param dirPath /sdcard/Pictures
* @return List<File>
*/
public static List<String> getImageFiles(String dirPath) {
List<String> imageFiles = new ArrayList<>();
List<String> pathList = new ArrayList<>();
File dir = new File(dirPath);
// 检查文件夹是否存在
if (!dir.exists() || !dir.isDirectory()) {
Log.e("Error", "文件夹不存在或不是目录: " + dirPath);
return imageFiles;
return pathList;
}
// 遍历文件夹中的文件
File[] files = dir.listFiles();
if (files == null) return imageFiles;
if (files == null) return pathList;
List<File> imageFiles = Arrays.asList(files);
// 按最后修改时间降序排序(最新的在前)
Collections.sort(imageFiles, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
return Long.compare(o2.lastModified(), o1.lastModified());
}
});
// 筛选图片文件(按扩展名)
for (File file : files) {
if (file.isFile() && isImageFile(file)) {
imageFiles.add(file.getAbsolutePath());
pathList.add(file.getAbsolutePath());
}
}
return imageFiles;
return pathList;
}
/**
@ -66,9 +77,7 @@ public class FileUtils {
*/
private static boolean isImageFile(File file) {
String name = file.getName().toLowerCase();
return name.endsWith(".jpg") || name.endsWith(".jpeg")
|| name.endsWith(".png") || name.endsWith(".webp")
|| name.endsWith(".gif") || name.endsWith(".bmp");
return name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".png") || name.endsWith(".webp") || name.endsWith(".gif") || name.endsWith(".bmp");
}
/**
@ -212,10 +221,7 @@ public class FileUtils {
if (!srcFile.exists() || !srcFile.isFile()) {
return false;
}
try (FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
FileChannel inChannel = fis.getChannel();
FileChannel outChannel = fos.getChannel()) {
try (FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(destFile); FileChannel inChannel = fis.getChannel(); FileChannel outChannel = fos.getChannel()) {
inChannel.transferTo(0, inChannel.size(), outChannel);
return true;
} catch (IOException e) {

@ -69,94 +69,5 @@
app:layout_constraintTop_toBottomOf="@+id/videotext" />
<Button
android:id="@+id/takePhoto1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:minWidth="72dp"
android:text="通道1"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/takeVideo1"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/takePhoto2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:text="通道2"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@+id/takePhoto1"
app:layout_constraintTop_toTopOf="@+id/takePhoto1" />
<Button
android:id="@+id/takePhoto3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:text="通道3"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@+id/takePhoto2"
app:layout_constraintTop_toTopOf="@+id/takePhoto1" />
<Button
android:id="@+id/takePhoto4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:text="通道4"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@+id/takePhoto3"
app:layout_constraintTop_toTopOf="@+id/takePhoto1" />
<Button
android:id="@+id/takeVideo1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginBottom="24dp"
android:minWidth="72dp"
android:text="视频1"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/takeVideo2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:text="视频2"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/takeVideo1"
app:layout_constraintStart_toEndOf="@id/takeVideo1" />
<Button
android:id="@+id/takeVideo3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:text="视频3"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/takeVideo1"
app:layout_constraintStart_toEndOf="@id/takeVideo2" />
<Button
android:id="@+id/takeVideo4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:text="视频4"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/takeVideo1"
app:layout_constraintStart_toEndOf="@id/takeVideo3" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -5,6 +5,7 @@
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".ImageActivity">
<include
@ -24,7 +25,8 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -7,51 +7,31 @@
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<!-- 自定义 Toolbar -->
<include
android:id="@+id/toolbar"
layout="@layout/toolbar"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:text="请先连接到设备的热点"
android:textSize="20dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:text="(绿色图标为当前已连接热点)"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />
<Button
android:text="第一步连接WIFI"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:background="@drawable/rounded_button"
android:id="@+id/selectWifi"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="40dp"
android:layout_marginRight="15dp"
android:background="@drawable/rounded_button"
android:text="第一步连接WIFI"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
app:layout_constraintTop_toBottomOf="@+id/toolbar" />
<Button
android:text="第二步:进入控制页面"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:background="@drawable/rounded_button"
android:id="@+id/control"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="40dp"
android:layout_marginRight="15dp"
android:background="@drawable/rounded_button"
android:text="第二步:进入控制页面"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/selectWifi" />

@ -4,64 +4,72 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".StreamActivity">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />
<androidx.media3.ui.PlayerView
android:id="@+id/playerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="0dip"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
app:resize_mode="fit"
app:show_buffering="always"
app:show_timeout="5000"
app:use_controller="false"
tools:ignore="MissingConstraints" />
<ImageButton
android:id="@+id/center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.9" />
<ImageButton
android:layout_marginBottom="10dp"
android:id="@+id/top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/up"
app:layout_constraintBottom_toTopOf="@+id/center"
app:layout_constraintLeft_toLeftOf="@+id/center" />
<!-- <ImageButton-->
<!-- android:id="@+id/center"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:background="@mipmap/refresh"-->
<!-- app:layout_constraintBottom_toBottomOf="parent"-->
<!-- app:layout_constraintLeft_toLeftOf="parent"-->
<!-- app:layout_constraintRight_toRightOf="parent"-->
<!-- app:layout_constraintTop_toTopOf="parent"-->
<!-- app:layout_constraintVertical_bias="0.9" />-->
<!-- <ImageButton-->
<!-- android:layout_marginBottom="10dp"-->
<!-- android:id="@+id/top"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:background="@mipmap/up"-->
<!-- app:layout_constraintBottom_toTopOf="@+id/center"-->
<!-- app:layout_constraintLeft_toLeftOf="@+id/center" />-->
<ImageButton
android:layout_marginRight="10dp"
android:id="@+id/left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/left"
app:layout_constraintRight_toLeftOf="@+id/center"
app:layout_constraintTop_toTopOf="@+id/center" />
<!-- <ImageButton-->
<!-- android:layout_marginRight="10dp"-->
<!-- android:id="@+id/left"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:background="@mipmap/left"-->
<!-- app:layout_constraintRight_toLeftOf="@+id/center"-->
<!-- app:layout_constraintTop_toTopOf="@+id/center" />-->
<ImageButton
android:layout_marginLeft="10dp"
android:id="@+id/right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/right"
app:layout_constraintLeft_toRightOf="@+id/center"
app:layout_constraintTop_toTopOf="@+id/center" />
<!-- <ImageButton-->
<!-- android:layout_marginLeft="10dp"-->
<!-- android:id="@+id/right"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:background="@mipmap/right"-->
<!-- app:layout_constraintLeft_toRightOf="@+id/center"-->
<!-- app:layout_constraintTop_toTopOf="@+id/center" />-->
<ImageView
android:layout_marginTop="10dp"
android:id="@+id/bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/down"
app:layout_constraintLeft_toLeftOf="@+id/center"
app:layout_constraintTop_toBottomOf="@+id/center" />
<!-- <ImageView-->
<!-- android:layout_marginTop="10dp"-->
<!-- android:id="@+id/bottom"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:background="@mipmap/down"-->
<!-- app:layout_constraintLeft_toLeftOf="@+id/center"-->
<!-- app:layout_constraintTop_toBottomOf="@+id/center" />-->
</androidx.constraintlayout.widget.ConstraintLayout>

@ -11,7 +11,7 @@
<ImageView
android:id="@+id/id_imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="200dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="2dp" />

@ -2,30 +2,47 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="56dip"
android:orientation="horizontal"
android:background="@color/orange_dark">
android:background="@color/orange_dark"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
<LinearLayout
android:id="@+id/back"
android:layout_width="40dp"
android:layout_height="match_parent"
android:src="@mipmap/back" />
android:layout_width="60dp"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@mipmap/back" />
</LinearLayout>
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:text="欣影遥控"
android:textColor="@color/white"
android:textSize="20sp" />
<Space
android:layout_gravity="center"
android:layout_width="40dp"
<LinearLayout
android:id="@+id/refresh"
android:layout_width="60dp"
android:layout_height="match_parent"
/>
android:visibility="invisible">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:text="刷新"
android:textColor="@color/white"
android:textSize="25sp" />
</LinearLayout>
</LinearLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Loading…
Cancel
Save