码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图,Kotlin(6)


    Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图,Kotlin(6)

    Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5)-CSDN博客文章浏览阅读1.3k次。Android DynamicGrid:拖曳交换位置Android DynamicGrid是一个第三方开源项目,DynamicGrid在github上的项目主页是:https://github.com/askerov/DynamicGrid它实现在一个网格布局内,拖曳任意子view实现动态的交换位置,这很类似手机的桌面,手机桌面的图标,均可自由拖曳实现摆放位置的交换,如动图所示:_android 拖拽交换位置。Android View拖拽startDragAndDrop,Kotlin-CSDN博客。https://blog.csdn.net/zhangphil/article/details/134269432上面文章(5)虽然可以做到拖拽实现Glide动态加载1张或若干张堆叠的旋转图片,但需要在xml布局和上层Kotlin代码中小心谨慎的写好(计算好)尺寸,否则会显示布局和View异常,不够灵活。这次,现在改造文章(5)中的实现,实现低代码、灵活加载旋转的堆叠图。

    1. import android.content.ClipData
    2. import android.content.Context
    3. import android.graphics.Canvas
    4. import android.graphics.Point
    5. import android.os.Bundle
    6. import android.util.Log
    7. import android.view.DragEvent
    8. import android.view.LayoutInflater
    9. import android.view.View
    10. import android.view.View.OnDragListener
    11. import android.view.View.OnLongClickListener
    12. import android.widget.FrameLayout
    13. import android.widget.ImageView
    14. import android.widget.TextView
    15. import androidx.appcompat.app.AppCompatActivity
    16. import androidx.core.view.children
    17. import com.bumptech.glide.load.resource.bitmap.CenterCrop
    18. import com.bumptech.glide.load.resource.bitmap.RoundedCorners
    19. class MainActivity : AppCompatActivity() {
    20. companion object {
    21. const val TAG = "fly"
    22. const val DEGREE = -10 //图片旋转的角度。
    23. const val RADIUS = 30 //图片的圆角半径。
    24. }
    25. override fun onCreate(savedInstanceState: Bundle?) {
    26. super.onCreate(savedInstanceState)
    27. setContentView(R.layout.activity_main)
    28. val shadowBuilder = createDragShadowBuilder()
    29. setData(shadowBuilder.getShadowView())
    30. val triggerView = findViewById(R.id.image)
    31. triggerView.setOnLongClickListener(object : OnLongClickListener {
    32. //长按事件触发拖拽.
    33. override fun onLongClick(v: View?): Boolean {
    34. val data = ClipData.newPlainText("name", "phil") //测试数据。
    35. triggerView.startDragAndDrop(
    36. data,
    37. shadowBuilder,
    38. null,
    39. 0 or View.DRAG_FLAG_GLOBAL or View.DRAG_FLAG_OPAQUE
    40. )
    41. return true
    42. }
    43. })
    44. triggerView.setOnDragListener(object : OnDragListener {
    45. override fun onDrag(v: View?, event: DragEvent?): Boolean {
    46. when (event?.action) {
    47. DragEvent.ACTION_DRAG_STARTED -> {
    48. //拖放开始
    49. Log.d(TAG, "ACTION_DRAG_STARTED")
    50. }
    51. DragEvent.ACTION_DRAG_ENTERED -> {
    52. //进入imageView
    53. Log.d(TAG, "ACTION_DRAG_ENTERED")
    54. }
    55. DragEvent.ACTION_DRAG_ENDED -> {
    56. //拖放结束
    57. Log.d(TAG, "ACTION_DRAG_ENDED")
    58. }
    59. DragEvent.ACTION_DRAG_EXITED -> {
    60. //离开imageView
    61. Log.d(TAG, "ACTION_DRAG_EXITED")
    62. }
    63. }
    64. return true
    65. }
    66. })
    67. }
    68. private fun createDragShadowBuilder(): MyDragShadowBuilder {
    69. val shadowView = LayoutInflater.from(this).inflate(R.layout.dnd, null)
    70. return MyDragShadowBuilder(this, shadowView)
    71. }
    72. private fun setData(viewGroup: View) {
    73. //从1和4两个数字中随机选一个。
    74. var cnt = intArrayOf(1, 4).random()
    75. Log.d(TAG, "cnt=$cnt")
    76. val number = viewGroup.findViewById(R.id.number)
    77. when (cnt) {
    78. 1 -> {
    79. //只显示一张。
    80. number.text = "1"
    81. val fl: FrameLayout? = viewGroup as? FrameLayout
    82. fl?.children?.filter {
    83. (it as? ImageView)?.tag == resources.getString(R.string.normal_image_view_tag)
    84. }?.forEach { view ->
    85. view.apply {
    86. View.GONE
    87. }
    88. }
    89. }
    90. 4 -> {
    91. //显示重叠在一起的4张。
    92. number.text = "4"
    93. val resIds = arrayOf(
    94. R.mipmap.pic1,
    95. R.mipmap.pic2,
    96. R.mipmap.pic3
    97. )
    98. val fl: FrameLayout? = viewGroup as? FrameLayout
    99. fl?.children?.filter {
    100. (it as? ImageView)?.tag == resources.getString(R.string.normal_image_view_tag)
    101. }?.forEachIndexed { index, view ->
    102. view.apply {
    103. View.VISIBLE
    104. }
    105. val degree = (resIds.size - index) * DEGREE
    106. Log.d(TAG, "index=$index degree=$degree")
    107. view.rotation = degree.toFloat()
    108. GlideApp.with(this)
    109. .load(resIds[index])
    110. .transform(CenterCrop(), RoundedCorners(RADIUS)) //先中心缩放,再切圆角。
    111. .override(
    112. resources.getDimensionPixelSize(R.dimen.image_size_w),
    113. resources.getDimensionPixelSize(R.dimen.image_size_h)
    114. ).placeholder(R.drawable.ic_launcher_foreground)
    115. .error(android.R.drawable.stat_notify_error)
    116. .into(view as ImageView)
    117. }
    118. }
    119. }
    120. val folder = viewGroup.findViewById(R.id.folder)
    121. //封面
    122. GlideApp.with(this)
    123. .load(R.mipmap.pic4)
    124. .transform(CenterCrop(), RoundedCorners(RADIUS)) //先中心缩放,再切圆角。
    125. .override(
    126. resources.getDimensionPixelSize(R.dimen.image_size_w),
    127. resources.getDimensionPixelSize(R.dimen.image_size_h)
    128. ).placeholder(R.drawable.ic_launcher_foreground)
    129. .error(android.R.drawable.stat_notify_error)
    130. .into(folder)
    131. }
    132. class MyDragShadowBuilder(ctx: Context, private var mShadow: View) :
    133. View.DragShadowBuilder() {
    134. //放大参数 1.5 , 2.0
    135. //适当的放大拖拽区域的面积,否则因为图片旋转,左右两侧和顶部因为旋转半径,图会被切边。
    136. //简单的说,绘制略微大一些的区域,容纳图片旋转,半径扫过的区域。
    137. private val width: Int =
    138. (ctx.resources.getDimensionPixelSize(R.dimen.image_size_w) * 1.5).toInt()
    139. private val height: Int =
    140. (ctx.resources.getDimensionPixelSize(R.dimen.image_size_h) * 2.0).toInt()
    141. fun getShadowView(): View {
    142. return mShadow
    143. }
    144. override fun onProvideShadowMetrics(outShadowSize: Point?, outShadowTouchPoint: Point?) {
    145. //拖动图像的宽和高
    146. outShadowSize?.set(width, height)
    147. //手指在拖动图像的位置 中点
    148. outShadowTouchPoint?.set(width / 2, height / 2)
    149. }
    150. override fun onDrawShadow(canvas: Canvas) {
    151. mShadow.measure(width, height)
    152. mShadow.layout(0, 0, width, height)
    153. mShadow.draw(canvas)
    154. Log.d(TAG, "onDrawShadow width=${mShadow.width} height=${mShadow.height}")
    155. }
    156. }
    157. }

    dnd.xml:

    1. "1.0" encoding="utf-8"?>
    2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. android:layout_width="wrap_content"
    5. android:layout_height="wrap_content"
    6. android:background="@android:color/holo_orange_light">
    7. <ImageView
    8. android:id="@+id/iv1"
    9. android:layout_width="wrap_content"
    10. android:layout_height="wrap_content"
    11. android:layout_gravity="center"
    12. android:tag="@string/normal_image_view_tag" />
    13. <ImageView
    14. android:id="@+id/iv2"
    15. android:layout_width="wrap_content"
    16. android:layout_height="wrap_content"
    17. android:layout_gravity="center"
    18. android:tag="@string/normal_image_view_tag" />
    19. <ImageView
    20. android:id="@+id/iv3"
    21. android:layout_width="wrap_content"
    22. android:layout_height="wrap_content"
    23. android:layout_gravity="center"
    24. android:tag="@string/normal_image_view_tag" />
    25. <ImageView
    26. android:id="@+id/folder"
    27. android:layout_width="wrap_content"
    28. android:layout_height="wrap_content"
    29. android:layout_gravity="center" />
    30. <androidx.cardview.widget.CardView
    31. android:layout_width="30dp"
    32. android:layout_height="30dp"
    33. android:layout_gravity="top|right"
    34. app:cardBackgroundColor="@android:color/holo_red_light"
    35. app:cardCornerRadius="15dp">
    36. <TextView
    37. android:id="@+id/number"
    38. android:layout_width="wrap_content"
    39. android:layout_height="wrap_content"
    40. android:layout_gravity="center"
    41. android:text="--"
    42. android:textColor="@android:color/white"
    43. android:textSize="15dp" />
    44. androidx.cardview.widget.CardView>
    45. FrameLayout>

    注意,根布局layout如果不使用FrameLayout,而是其他layout布局如RelativeLayout或ConstraintLayout,xml里面定义的居中放置子View失效。

    dimens.xml:

    1. "1.0" encoding="utf-8"?>
    2. <resources>
    3. <dimen name="image_size_w">180dpdimen>
    4. <dimen name="image_size_h">120dpdimen>
    5. resources>

    strings.xml:

    1. <resources>
    2. <string name="normal_image_view_tag">normal_image_view_tagstring>
    3. resources>

    拖拽1张图片:

    拖拽4张图片,背景3张旋转,封面不旋转:

    Android改造CardView为圆形View,Kotlin_android 圆形view-CSDN博客文章浏览阅读1k次。可以利用androidx.cardview.widget.CardView的cardCornerRadius特性,将CardView改造成一个圆形的View,技术实现的关键首先设定CardView为一个宽高相等的View(正方形),然后将radius特意设置成宽度(或高度,一样,因为正方形,宽高相等)的1/2,此时CardView自然就变成一个圆。Android RoundedBitmapDrawable:Android官方的圆角图形图象实现方案_android 官方圆角-CSDN博客。_android 圆形viewhttps://blog.csdn.net/zhangphil/article/details/133346170

  • 相关阅读:
    Python可视化 | Python可视化进阶必备 - plotly
    10道不得不会的Docker面试题
    新版本的AndroidStudio生产签名文件打包失败
    Ruo-Yi 前后端分离如何不登录直接访问以及一种基于配置文件实现的方式
    阿里云 ACK@Edge 助力元戎启行加速进入自动驾驶规模化生产
    什么是RPA机器人流程自动化软件?
    浏览器缓存 四种缓存分类 两种缓存类型
    【QT】Qt Creator生成动态库(DLL)并调用
    【计算机网络】P1 计算机网络概述
    使用Python调用API接口获取淘宝商品数据
  • 原文地址:https://blog.csdn.net/zhangphil/article/details/134291251
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号