具有进度动画的 Toast 视图,Android 平台上从左往右显示。

4
需要一个解决方案来添加带有进度条的摇晃视图。这个视图在Android中被用作Toast视图。我已经有了一个解决方案,使得视图从中心变大,并需要帮助将其转化为期望的结果。目前的状态已经压缩在驱动器中,其中包含实际视频和期望的视频。
现有的growFromCenter扩展函数和Object animator都试过了,但在将它们与进度条结合时遇到了阻碍。
参考资料:

视频和当前状态源代码

private fun View.growFromCenter(
    duration: Long,
    @FloatRange(from = 0.0, to = 1.0)
    startScaleRatio: Float,
    endAnimCallback: () -> Unit = {},
) {
    val growFromCenter = ScaleAnimation(
        startScaleRatio,
        1f,
        startScaleRatio,
        1f,
        Animation.RELATIVE_TO_SELF,
        0.5f,
        Animation.RELATIVE_TO_SELF,
        0.5f
    )
    growFromCenter.duration = duration
    growFromCenter.fillAfter = true
    growFromCenter.interpolator = FastOutSlowInInterpolator()
    growFromCenter.setAnimationListener(object : Animation.AnimationListener {
        override fun onAnimationStart(p0: Animation?) {

        }

        override fun onAnimationEnd(p0: Animation?) {
            endAnimCallback.invoke()
        }

        override fun onAnimationRepeat(p0: Animation?) {

        }
    })

    startAnimation(growFromCenter)

}

3个回答

3
震动带有进度条的视图。
  • Step 1: In res/anim create file animation.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <scale
     android:duration="350"
     android:fromXScale="0.0"
     android:fromYScale="0.5"
     android:pivotX="100%"
     android:pivotY="50%"
     android:toXScale="1.0"
     android:toYScale="1.0" />
    <translate
     android:duration="175"
     android:fromXDelta="0%"
     android:repeatCount="5"
     android:repeatMode="reverse"
     android:toXDelta="7%" />
    </set>
    
  • Step 2: In your require Activity

     class MainActivity : AppCompatActivity() {
     private val viewModel:MainActivityViewModel by viewModels()
     private  lateinit var  mBinding: ActivityMainBinding
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         mBinding=ActivityMainBinding.inflate(layoutInflater)
         setContentView(mBinding.root)
    
         viewModel.currentTime.observe(this) {
             val seconds = TimeUnit.MILLISECONDS.toSeconds(it*100)- TimeUnit.MINUTES.toSeconds(
                 TimeUnit.MILLISECONDS.toMinutes(it*100)
             )
             val minutes = TimeUnit.MILLISECONDS.toMinutes(it*100)
             Log.v("timmer", "$minutes : ${seconds}")
             mBinding.progressBar.progress = it.toInt()
    
         }
        mBinding.btn.setOnClickListener {
             mBinding.mtrlCardChecked.visibility= View.VISIBLE
            mBinding.progressBar.visibility=View.VISIBLE
            mBinding.mtrlCardChecked.startAnimation(AnimationUtils.loadAnimation(this, R.anim.animation))
            viewModel.timer(15000L)
            mBinding.progressBar.max=15*10
         }
    
    }}
    
  • Step 3: In ViewModel of your require activity

      package com.example.toasty
    
     import android.os.CountDownTimer
     import androidx.lifecycle.LiveData
     import androidx.lifecycle.MutableLiveData
     import androidx.lifecycle.ViewModel
    
    
    class MainActivityViewModel : ViewModel() {
    private var ONE_SEC = 100L
     lateinit var mCountDownTimer: CountDownTimer
    
     private val _currentTime: MutableLiveData<Long> = MutableLiveData<Long>(0)
     val currentTime: LiveData<Long> = _currentTime
     fun timer(countTimer: Long) {
         mCountDownTimer = object : CountDownTimer(countTimer, ONE_SEC) {
             override fun onTick(p0: Long) {
                 _currentTime.value = (p0 / ONE_SEC)
    
             }
             override fun onFinish() {
             }
         }
         mCountDownTimer.start()
     }
    

    }

  • Step 4: In your activity_main.xml file

     <?xml version="1.0" encoding="utf-8"?>
     <androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/ctl"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity">
    
     <com.google.android.material.button.MaterialButton
         android:id="@+id/btn"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="Hello Toasty!"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
    
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/mtrl_card_checked"
         android:layout_width="match_parent"
         android:layout_height="100dp"
         android:layout_margin="10dp"
         android:visibility="gone"
         app:cardCornerRadius="3dp"
         app:cardElevation="12dp"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent">
    
         <View
             android:id="@+id/v_bar"
             android:layout_width="5dp"
             android:layout_height="90dp"
             android:background="@android:color/holo_green_light"
             app:layout_constraintBottom_toTopOf="@id/progressBar"
             app:layout_constraintStart_toStartOf="parent" />
    
         <androidx.appcompat.widget.AppCompatImageView
             android:id="@+id/iv_message_icon"
             android:layout_width="56dp"
             android:layout_height="56dp"
             android:background="@android:color/holo_green_light"
             android:src="@drawable/ic_launcher_foreground"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintStart_toEndOf="@id/v_bar"
             app:layout_constraintTop_toTopOf="parent" />
    
         <androidx.appcompat.widget.AppCompatImageView
             android:id="@+id/iv_message_icon_type"
             android:layout_width="20dp"
             android:layout_height="20dp"
             android:padding="4dp"
             app:layout_constraintBottom_toBottomOf="@id/iv_message_icon"
             app:layout_constraintEnd_toEndOf="@id/iv_message_icon" />
    
         <TextView
             android:id="@+id/tv_message"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_marginEnd="5dp"
             android:text="You have too many players in the same position. To pick another, transfer one out. (2/2)"
             app:layout_constraintBottom_toBottomOf="@id/iv_message_icon"
             app:layout_constraintEnd_toStartOf="@id/iBtn_message_popup_close"
             app:layout_constraintStart_toEndOf="@id/iv_message_icon"
             app:layout_constraintTop_toTopOf="@id/iv_message_icon" />
    
         <androidx.appcompat.widget.AppCompatImageButton
             android:id="@+id/iBtn_message_popup_close"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_margin="6dp"
             android:background="?actionBarItemBackground"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
    
         <com.google.android.material.progressindicator.LinearProgressIndicator
             android:id="@+id/progressBar"
             android:layout_width="0dp"
             android:layout_height="50dp"
             android:progress="10"
             android:secondaryProgressTintMode="screen"
             app:indicatorColor="@color/teal_200"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@id/v_bar"
             app:trackColor="@color/purple_200"
             app:trackThickness="10dp" />
    
     </androidx.constraintlayout.widget.ConstraintLayout>
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

您可以直接从Github仓库下载示例项目。

输入图像描述


实现中没有退出动画,进度动画也不够流畅。建议使用摇晃动画代替弹跳效果。 - Sharan
1
实际上,你首先提到了弹跳视图,所以我用了弹跳视图。现在,我已经更新了震动视图的代码。 - Muhammad Ibrahim
1
请使用更新后的代码更新animation.xml文件。 - Muhammad Ibrahim
1
我在代码库中也更新了代码。 - Muhammad Ibrahim
它不像预期的结果那样顺畅:https://drive.google.com/drive/folders/1YT4DFEyrV1V0kDRqbLCfiq2xfqscnoPK - Sharan

3

我正在寻找一种从左到右或从右到左的视图,而不是小吃店。 - Sharan

0

制作自定义视图后,您可以使用以下代码以动画方式显示它

    val snackBarView = Snackbar.make(view, "SnackBar Message" , Snackbar.LENGTH_LONG)
    val view = snackBarView.view
    val params = view.layoutParams as FrameLayout.LayoutParams
    params.gravity = Gravity.TOP
    view.layoutParams = params
    view.background = ContextCompat.getDrawable(context,R.drawable.custom_drawable) // for custom background
    snackBarView.animationMode = BaseTransientBottomBar.ANIMATION_MODE_FADE
    snackBarView.show()

以下代码将解决动画问题。

snackBarView.animationMode = BaseTransientBottomBar.ANIMATION_MODE_FADE

备选方案 - snackBarView.anchorView = 在你想要显示 SnackBar 的上面提到的视图 ID

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接