clip.xml资源文件---android

本文通过一个具体的例子介绍了如何正确使用Android中的ClipDrawable组件,并详细解释了常见错误及其修正方法。

今天想把drawable下的所有Drawable Resources 弄清楚,看到Clip Drawable 的时候,把以下原文档里的列子考到自己建的项目下

clip.xml

<?xml version="1.0" encoding="utf-8"?>

<clip xmlns:android=http://schemas.android.com/apk/res/android

android:drawable="@drawable/android"

 android:clipOrientation="horizontal"

 android:gravity="left" />

</clip>-----------------------------①

 

main.xml加入

<ImageView android:id="@+id/image" android:background="@drawable/clip" android:layout_height="wrap_content" android:layout_width="wrap_content" />

 

MainActivity加入

ImageView imageview = (ImageView) findViewById(R.id.image);

ClipDrawable drawable = (ClipDrawable) imageview.getDrawable();-------------------------②

drawable.setLevel(drawable.getLevel() + 1000);

 

当这样做好之后,你会发现①处根本是多余的。这个很容易发现。

其二,②处竟然报空指针异常。

看了ClipDrawable中的方法已及clip.xml中android:drawable="@drawable/android"找到了这个方法

ClipDrawable drawable = (ClipDrawable) imageview.getBackground();

改成上述就可以运行了。

2025-10-30 19:03:55.611 16318-16318 MainActivity com.tencent.yolov5ncnn D decodeVideo: ------------/-1/2/content:/media/external/video/media/29/ORIGINAL/NONE/video/mp4/1895746813===============/-1/2/content://media/external/video/media/29/ORIGINAL/NONE/video/mp4/1895746813 2025-10-30 19:03:55.678 16318-16325 cent.yolov5ncnn com.tencent.yolov5ncnn I NativeAlloc concurrent mark compact GC freed 1145KB AllocSpace bytes, 3(60KB) LOS objects, 49% free, 1919KB/3839KB, paused 8.932ms,4.182ms total 57.817ms 2025-10-30 19:03:55.717 1938-1951 DatabaseUtils com...ndroid.providers.media.module E Writing exception to parcel java.lang.SecurityException: com.tencent.yolov5ncnn has no access to content://media/external/video/media/29 at com.android.providers.media.MediaProvider.enforceCallingPermissionInternal(MediaProvider.java:11734) at com.android.providers.media.MediaProvider.enforceCallingPermission(MediaProvider.java:11631) at com.android.providers.media.MediaProvider.checkAccess(MediaProvider.java:11755) at com.android.providers.media.MediaProvider.checkAccessForThumbnail(MediaProvider.java:9929) at com.android.providers.media.MediaProvider.ensureThumbnail(MediaProvider.java:9848) at com.android.providers.media.MediaProvider.openTypedAssetFileCommon(MediaProvider.java:9833) at com.android.providers.media.MediaProvider.openTypedAssetFile(MediaProvider.java:9773) at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:677) at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:341) at android.os.Binder.execTransactInternal(Binder.java:1421) at android.os.Binder.execTransact(Binder.java:1365) 2025-10-30 19:03:55.722 16318-16318 MediaStore com.tencent.yolov5ncnn W Failed to obtain thumbnail for content://media/external/video/media/29 java.io.IOException: java.lang.SecurityException: com.tencent.yolov5ncnn has no access to content://media/external/video/media/29 at android.graphics.ImageDecoder$CallableSource.createImageDecoder(ImageDecoder.java:615) at android.graphics.ImageDecoder.decodeBitmapImpl(ImageDecoder.java:1858) at android.graphics.ImageDecoder.decodeBitmap(ImageDecoder.java:1850) at android.content.ContentResolver.loadThumbnail(ContentResolver.java:4173) at android.content.ContentResolver.loadThumbnail(ContentResolver.java:4157) at android.provider.MediaStore$InternalThumbnails.getThumbnail(MediaStore.java:2932) at android.provider.MediaStore$Video$Thumbnails.getThumbnail(MediaStore.java:4612) at com.tencent.yolov5ncnn.MainActivity.decodeVideo(MainActivity.java:450) at com.tencent.yolov5ncnn.MainActivity.onActivityResult(MainActivity.java:237) at android.app.Activity.onActivityResult(Activity.java:7626) at android.app.Activity.internalDispatchActivityResult(Activity.java:9546) at android.app.Activity.dispatchActivityResult(Activity.java:9523) at android.app.ActivityThread.deliverResults(ActivityThread.java:6173) at android.app.ActivityThread.handleSendResult(ActivityThread.java:6223) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:78) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:63) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2823) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) Caused by: java.lang.SecurityException: com.tencent.yolov5ncnn has no access to content://media/external/video/media/29 at android.os.Parcel.createExceptionOrNull(Parcel.java:3340) at android.os.Parcel.createException(Parcel.java:3324) at android.os.Parcel.readException(Parcel.java:3307) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:201) at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:164) at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:814) at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:2045) at android.content.ContentResolver.openTypedAssetFile(ContentResolver.java:1950) at android.content.ContentResolver.lambda$loadThumbnail$0(ContentResolver.java:4174) at android.content.ContentResolver$$ExternalSyntheticLambda0.call(D8$$SyntheticClass:0) at android.graphics.ImageDecoder$CallableSource.createImageDecoder(ImageDecoder.java:610) ... 26 more 2025-10-30 19:03:55.771 16318-16318 ThumbnailUtils com.tencent.yolov5ncnn W java.io.IOException: Failed to create thumbnail at android.media.ThumbnailUtils.createVideoThumbnail(ThumbnailUtils.java:391) at android.media.ThumbnailUtils.createVideoThumbnail(ThumbnailUtils.java:333) at com.tencent.yolov5ncnn.MainActivity.decodeVideo(MainActivity.java:454) at com.tencent.yolov5ncnn.MainActivity.onActivityResult(MainActivity.java:237) at android.app.Activity.onActivityResult(Activity.java:7626) at android.app.Activity.internalDispatchActivityResult(Activity.java:9546) at android.app.Activity.dispatchActivityResult(Activity.java:9523) at android.app.ActivityThread.deliverResults(ActivityThread.java:6173) at android.app.ActivityThread.handleSendResult(ActivityThread.java:6223) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:78) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:63) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2823) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) Caused by: java.lang.IllegalArgumentException: /storage/emulated/0/Download/20251011_112303.mp4 does not exist at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:255) at android.media.ThumbnailUtils.createVideoThumbnail(ThumbnailUtils.java:362) ... 21 more 2025-10-30 19:03:55.776 16318-16318 MainActivity com.tencent.yolov5ncnn D decodeVideo_address: ====================/storage/emulated/0/Download/20251011_112303.mp4-------/storage/emulated/0 2025-10-30 19:03:55.956 16318-16318 MediaCodecList com.tencent.yolov5ncnn D codecHandlesFormat: no format, so no extra checks 2025-10-30 19:03:55.958 16318-16318 MediaCodecList com.tencent.yolov5ncnn D codecHandlesFormat: no format, so no extra checks 2025-10-30 19:03:55.969 16318-16389 CCodec com.tencent.yolov5ncnn D allocate(c2.goldfish.h264.decoder) 2025-10-30 19:03:55.975 16318-16389 ApexCodecsLazy com.tencent.yolov5ncnn I Failed to load libcom.android.media.swcodec.apexcodecs.so: dlopen failed: library "libcom.android.media.swcodec.apexcodecs.so" not found 2025-10-30 19:03:55.975 16318-16389 Codec2Client com.tencent.yolov5ncnn I Available Codec2 services: "default" "software" 2025-10-30 19:03:55.985 16318-16389 CCodec com.tencent.yolov5ncnn I setting up 'default' as default (vendor) store 2025-10-30 19:03:56.003 16318-16389 CCodec com.tencent.yolov5ncnn I Created component [c2.goldfish.h264.decoder] for [c2.goldfish.h264.decoder] 2025-10-30 19:03:56.005 16318-16389 CCodecConfig com.tencent.yolov5ncnn D read media type: video/avc 2025-10-30 19:03:56.023 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: algo.buffers.max-count.values 2025-10-30 19:03:56.024 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: output.subscribed-indices.values 2025-10-30 19:03:56.025 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: input.buffers.allocator-ids.values 2025-10-30 19:03:56.026 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: output.buffers.allocator-ids.values 2025-10-30 19:03:56.027 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: algo.buffers.allocator-ids.values 2025-10-30 19:03:56.027 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: output.buffers.pool-ids.values 2025-10-30 19:03:56.028 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: algo.buffers.pool-ids.values 2025-10-30 19:03:56.033 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D ignored struct field coded.color-format.locations 2025-10-30 19:03:56.041 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D ignored struct field resources.needed.values 2025-10-30 19:03:56.041 16318-16389 CCodecConfig com.tencent.yolov5ncnn D ignoring local param raw.size (0xd2001800) as it is already supported 2025-10-30 19:03:56.041 16318-16389 CCodecConfig com.tencent.yolov5ncnn D ignoring local param default.color (0x5200180b) as it is already supported 2025-10-30 19:03:56.041 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D ignored struct field raw.hdr-static-info.mastering 2025-10-30 19:03:56.044 16318-16389 CCodecConfig com.tencent.yolov5ncnn I query failed after returning 12 values (BAD_INDEX) 2025-10-30 19:03:56.045 16318-16389 CCodecConfig com.tencent.yolov5ncnn D c2 config diff is Dict { c2::u32 coded.pl.level = 20496 c2::u32 coded.pl.profile = 20481 c2::u32 coded.vui.color.matrix = 0 c2::u32 coded.vui.color.primaries = 0 c2::u32 coded.vui.color.range = 2 c2::u32 coded.vui.color.transfer = 0 c2::u32 default.color.matrix = 0 c2::u32 default.color.primaries = 0 c2::u32 default.color.range = 0 c2::u32 default.color.transfer = 0 c2::u32 input.buffers.max-size.value = 6291456 c2::u32 input.delay.value = 0 string input.media-type.value = "video/avc" c2::u32 output.delay.value = 8 string output.media-type.value = "video/raw" c2::u32 raw.color.matrix = 0 c2::u32 raw.color.primaries = 0 c2::u32 raw.color.range = 2 c2::u32 raw.color.transfer = 0 c2::u32 raw.max-size.height = 240 c2::u32 raw.max-size.width = 320 c2::u32 raw.pixel-format.value = 35 c2::i32 raw.rotation.flip = 0 c2::i32 raw.rotation.value = 0 c2::u32 raw.sar.height = 1 c2::u32 raw.sar.width = 1 c2::u32 raw.size.height = 240 c2::u32 raw.size.width = 320 c2: 2025-10-30 19:03:56.046 16318-16389 ColorUtils com.tencent.yolov5ncnn W expected specified color aspects (2:0:0:0) 2025-10-30 19:03:56.080 16318-16318 TransactionExecutor com.tencent.yolov5ncnn E Failed to execute the transaction: tId:551909865 ClientTransaction{ tId:551909865 transactionItems=[ tId:551909865 TopResumedActivityChangeItem{mActivityToken=android.os.BinderProxy@7bd4eec,onTop=true} tId:551909865 Target activity: com.tencent.yolov5ncnn.MainActivity tId:551909865 ActivityResultItem{mActivityToken=android.os.BinderProxy@7bd4eec,resultInfoList=[ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/... flg=0x1 xflg=0x4 clip={text/uri-list {U(content)}} }}]} tId:551909865 Target activity: com.tencent.yolov5ncnn.MainActivity tId:551909865 ResumeActivityItem{mActivityToken=android.os.BinderProxy@7bd4eec,procState=2,isForward=false,shouldSendCompatFakeFocus=false} tId:551909865 Target activity: com.tencent.yolov5ncnn.MainActivity tId:551909865 ] tId:551909865 } 2025-10-30 19:03:56.081 16318-16318 AndroidRuntime com.tencent.yolov5ncnn D Shutting down VM 2025-10-30 19:03:56.082 16318-16318 AndroidRuntime com.tencent.yolov5ncnn E FATAL EXCEPTION: main Process: com.tencent.yolov5ncnn, PID: 16318 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/... flg=0x1 xflg=0x4 clip={text/uri-list {U(content)}} }} to activity {com.tencent.yolov5ncnn/com.tencent.yolov5ncnn.MainActivity}: java.lang.IllegalArgumentException: The surface has been released at android.app.ActivityThread.deliverResults(ActivityThread.java:6184) at android.app.ActivityThread.handleSendResult(ActivityThread.java:6223) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:78) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:63) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2823) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) Caused by: java.lang.IllegalArgumentException: The surface has been released at android.media.MediaCodec.native_configure(Native Method) at android.media.MediaCodec.configure(MediaCodec.java:2562) at android.media.MediaCodec.configure(MediaCodec.java:2422) at com.tencent.yolov5ncnn.MainActivity.decodeVideo(MainActivity.java:514) at com.tencent.yolov5ncnn.MainActivity.onActivityResult(MainActivity.java:237) at android.app.Activity.onActivityResult(Activity.java:7626) at android.app.Activity.internalDispatchActivityResult(Activity.java:9546) at android.app.Activity.dispatchActivityResult(Activity.java:9523) at android.app.ActivityThread.deliverResults(ActivityThread.java:6173) ... 14 more
10-31
--- Failed to create image decoder with message 'unimplemented' 2025-11-04 10:42:19.688 14141-14141 TransactionExecutor com.tencent.yolov5ncnn E Failed to execute the transaction: tId:-1604317424 ClientTransaction{ tId:-1604317424 transactionItems=[ tId:-1604317424 TopResumedActivityChangeItem{mActivityToken=android.os.BinderProxy@f3557d,onTop=true} tId:-1604317424 Target activity: com.tencent.yolov5ncnn.MainActivity tId:-1604317424 ActivityResultItem{mActivityToken=android.os.BinderProxy@f3557d,resultInfoList=[ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/... flg=0x1 xflg=0x4 clip={text/uri-list {U(content)}} }}]} tId:-1604317424 Target activity: com.tencent.yolov5ncnn.MainActivity tId:-1604317424 ResumeActivityItem{mActivityToken=android.os.BinderProxy@f3557d,procState=2,isForward=false,shouldSendCompatFakeFocus=false} tId:-1604317424 Target activity: com.tencent.yolov5ncnn.MainActivity tId:-1604317424 ] tId:-1604317424 } 2025-11-04 10:42:19.688 14141-14141 AndroidRuntime com.tencent.yolov5ncnn D Shutting down VM 2025-11-04 10:42:19.689 14141-14141 AndroidRuntime com.tencent.yolov5ncnn E FATAL EXCEPTION: main Process: com.tencent.yolov5ncnn, PID: 14141 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/... flg=0x1 xflg=0x4 clip={text/uri-list {U(content)}} }} to activity {com.tencent.yolov5ncnn/com.tencent.yolov5ncnn.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getByteCount()' on a null object reference at android.app.ActivityThread.deliverResults(ActivityThread.java:6184) at android.app.ActivityThread.handleSendResult(ActivityThread.java:6223) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:78) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:63) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2823) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getByteCount()' on a null object reference at com.tencent.yolov5ncnn.MainActivity.processByExtractor(MainActivity.java:540) at com.tencent.yolov5ncnn.MainActivity.decodeprocess(MainActivity.java:673) at com.tencent.yolov5ncnn.MainActivity.decodeVideo(MainActivity.java:614) at com.tencent.yolov5ncnn.MainActivity.onActivityResult(MainActivity.java:279) at android.app.Activity.onActivityResult(Activity.java:7626) at android.app.Activity.internalDispatchActivityResult(Activity.java:9546) at android.app.Activity.dispatchActivityResult(Activity.java:9523) at android.app.ActivityThread.deliverResults(ActivityThread.java:6173) ... 14 more 2025-11-04 10:42:19.752 14141-14141 Process com.tencent.yolov5ncnn I Sending signal. PID: 14141 SIG: 9
最新发布
11-05
为什么在下面代码中,图片是从中间向两边展开而不是从底部向上展开package com.example.bulbpage import android.graphics.drawable.ClipDrawable import android.os.Bundle import android.view.GestureDetector import android.view.MotionEvent import androidx.appcompat.app.AppCompatActivity import com.example.bulbpage.databinding.ActivityMainBinding import com.google.android.material.bottomsheet.BottomSheetBehavior class MainActivity : AppCompatActivity() { private var _binding: ActivityMainBinding? = null private val binding get() = _binding!! override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) _binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val btnBottomSheet = binding.btnBottomSheet val llBottomSheet = binding.llBottomSheet // val pullImageView = binding.pull // val seekBar = binding.seekBar // val lampProgressView = binding.lampProgressView // // // 隐藏 SeekBar // seekBar.visibility = View.GONE // // // 设置 SeekBar 最大值 // seekBar.max = 100 // // // SeekBar 控制 LampProgressView(已有逻辑) // seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { // override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { // val ratio = progress / 100f // lampProgressView.setProgress(ratio) // } // // override fun onStartTrackingTouch(seekBar: SeekBar?) {} // override fun onStopTrackingTouch(seekBar: SeekBar?) {} // }) // // // 绑定 LampProgressView 触摸事件 // lampProgressView.setOnTouchListener { view, event -> // when (event.action) { // MotionEvent.ACTION_DOWN, // MotionEvent.ACTION_MOVE -> { // val touchY = event.y // val viewHeight = view.height.toFloat() // // // 计算百分比(从下往上) // val progress = 1 - (touchY / viewHeight) // val clampedProgress = progress.coerceIn(0f…1f) // // // 更新 SeekBar 的进度 // seekBar.progress = (clampedProgress * seekBar.max).toInt() // // // 更新 LampProgressView 显示 // lampProgressView.setProgress(clampedProgress) // // return@setOnTouchListener true // } // } // false // } // // // BottomSheet 相关逻辑(保持不变) // // pullImageView.clipToOutline = true // pullImageView.outlineProvider = object : ViewOutlineProvider() { // override fun getOutline(view: View, outline: Outline) { // val cornerRadius = 80f // val path = Path() // val width = view.width.toFloat() // val height = view.height.toFloat() // // path.moveTo(0f, height) // path.lineTo(0f, cornerRadius) // path.quadTo(width / 2, 0f, width, cornerRadius) // path.lineTo(width, height) // path.close() // outline.setConvexPath(path) // } // } // // // behavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { // override fun onStateChanged(bottomSheet: View, newState: Int) { // updatePullSelectorState(newState) // } // // override fun onSlide(bottomSheet: View, slideOffset: Float) { // // 可选:滑动动画或透明度变化 // } // }) val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() { private var startY = 0f private var totalDelta = 0f private val maxDelta = 150 * resources.displayMetrics.density // 灯泡图高度 override fun onDown(e: MotionEvent): Boolean { startY = e.y return true } override fun onScroll( e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float ): Boolean { totalDelta += distanceY // 向上滑动为正 totalDelta = totalDelta.coerceIn(0f, maxDelta) val percent = (totalDelta / maxDelta) * 100 val level = (percent * 100).toInt() (binding.lampImageView.drawable as? ClipDrawable)?.level = level binding.percentText.text = "${percent.toInt()}%" return true } }) // 设置触摸监听器,让整个页面都能响应手势 binding.root.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event) } val behavior = BottomSheetBehavior.from(llBottomSheet) updatePullSelectorState(behavior.state) btnBottomSheet.setOnClickListener { if (behavior.state == BottomSheetBehavior.STATE_EXPANDED) { behavior.state = BottomSheetBehavior.STATE_COLLAPSED } else { behavior.state = BottomSheetBehavior.STATE_EXPANDED } } } private fun updatePullSelectorState(state: Int) { when (state) { BottomSheetBehavior.STATE_EXPANDED -> { binding.pull.isSelected = true } else -> { binding.pull.isSelected = false } } } override fun onDestroy() { super.onDestroy() _binding = null } } <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=“http://schemas.android.com/apk/res/androidxmlns:app=“http://schemas.android.com/apk/res-auto” android:layout_width=“match_parent” android:layout_height=“match_parent” android:background=“@color/background_gray”> <!--背景--> <ImageView android:id="@+id/background_on" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/on" android:visibility="visible" /> <ImageView android:id="@+id/imageView" android:layout_width="180dp" android:layout_height="244dp" android:layout_gravity="center_horizontal" android:layout_marginTop="207dp" android:src="@drawable/bulbbottom" /> <!--control--> <ImageView android:id="@+id/lampImageView" android:layout_width="wrap_content" android:layout_height="150dp" android:adjustViewBounds="true" android:scaleType="centerInside" android:src="@drawable/clip_bulb" /> <TextView android:id="@+id/percentText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="50%" android:textSize="18sp" android:textColor="#000" android:layout_marginTop="16dp"/> <!-- 灯泡显示比例 View --> <!-- <com.example.bulbpage.bulbcontrol.LampProgressView--> <!-- android:id="@+id/lampProgressView"--> <!-- android:layout_width="180dp"--> <!-- android:layout_height="228dp"--> <!-- android:layout_gravity="center_horizontal"--> <!-- android:layout_marginTop="190dp" />--> <!-- 灯泡底座--> <ImageView android:layout_width="180dp" android:layout_height="658dp" android:layout_gravity="center_horizontal" android:src="@drawable/bulbonbottom" app:layout_anchor="@+id/background_on" app:layout_anchorGravity="center" /> <!-- <SeekBar--> <!-- android:id="@+id/seekBar"--> <!-- android:layout_width="0dp"--> <!-- android:layout_height="0dp"--> <!-- android:layout_gravity="bottom"--> <!-- android:layout_marginBottom="100dp"--> <!-- android:max="100"--> <!-- android:progress="0"--> <!-- android:visibility="gone" />--> <!--开关按钮--> <ImageButton android:id="@+id/switch_button" android:layout_width="60dp" android:layout_height="60dp" android:layout_gravity="center_horizontal" android:layout_marginTop="476dp" android:background="@android:color/transparent" android:scaleType="centerInside" android:src="@drawable/switchselector" /> <!--隐藏栏开关--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="60dp" android:gravity="center" android:orientation="vertical"> <Button android:id="@+id/btn_bottom_sheet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:text="BottomSheet" android:textAllCaps="false" /> </LinearLayout> <!--隐藏toolbar--> <LinearLayout android:id="@+id/ll_bottom_sheet" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" app:behavior_peekHeight="110dp" app:layout_behavior="@string/bottom_sheet_behavior"> <ImageView android:id="@+id/pull" android:layout_width="match_parent" android:layout_height="30dp" android:background="@color/white" android:clickable="false" android:focusable="false" android:gravity="center" android:paddingTop="15dp" android:src="@drawable/pullselector" /> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:background="@color/white" android:gravity="center" android:text="c" android:textSize="20sp" /> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:background="@android:color/holo_orange_dark" android:gravity="center" android:text="b" android:textSize="20sp" /> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:background="@android:color/holo_green_light" android:gravity="center" android:text="c" android:textSize="20sp" /> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:background="@android:color/holo_orange_dark" android:gravity="center" android:text="b" android:textSize="20sp" /> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:background="@android:color/holo_orange_light" android:gravity="center" android:text="c" android:textSize="20sp" /> </LinearLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> <!-- res/drawable/clip_bulb.xml --> <!-- res/drawable/clip_bulb.xml -->
08-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值