Skip to content

Instantly share code, notes, and snippets.

View PhongHuynh93's full-sized avatar

Phong Huỳnh PhongHuynh93

View GitHub Profile
@PhongHuynh93
PhongHuynh93 / Webview.swift
Created September 25, 2021 05:54 — forked from joshbetz/Webview.swift
SwiftUI Webview with a Progress Bar
struct Webview: UIViewControllerRepresentable {
let url: URL
func makeUIViewController(context: Context) -> WebviewController {
let webviewController = WebviewController()
let request = URLRequest(url: self.url, cachePolicy: .returnCacheDataElseLoad)
webviewController.webview.load(request)
return webviewController
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.umbrella.tiktok.widget.TikTokButton
android:id="@+id/btn"
android:layout_width="44dp"
android:layout_height="28dp"
android:layout_gravity="center" />
class TikTokButton @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : View(context, attrs, defStyle) {
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
private val spaceTiny = context.spaceTiny
private val radius = context.spaceSmall
private val rightColor = Color.parseColor("#E5436D")
private val leftColor = Color.parseColor("#65D1E8")
@PhongHuynh93
PhongHuynh93 / TikTokButton.kt
Last active July 21, 2021 02:23
Skeleton Structure of TikTokButton
// 1: Create skeleton structure in OnDraw() method
override fun onDraw(canvas: Canvas) {
canvas.drawBitmap(bitmapOfThisView, 0f, 0f, paint)
}
private fun getRightPaint() = paint.apply {
color = rightColor
}
private fun getLeftPaint() = paint.apply {
@PhongHuynh93
PhongHuynh93 / LikeAnimButton.kt
Last active September 25, 2021 20:33
LikeAnimButton
package com.umbrella.likeanimbutton.widget
import android.animation.ArgbEvaluator
import android.animation.ValueAnimator
import android.content.Context
import android.graphics.*
import android.text.TextPaint
import android.util.AttributeSet
import android.view.View
import androidx.core.animation.doOnEnd
@NonNull
public ViewTarget<ImageView, TranscodeType> into(@NonNull ImageView view) {
Util.assertMainThread();
Preconditions.checkNotNull(view);
BaseRequestOptions<?> requestOptions = this;
if (!requestOptions.isTransformationSet()
&& requestOptions.isTransformationAllowed()
&& view.getScaleType() != null) {
// Clone in this method so that if we use this RequestBuilder to load into a View and then
val targetFrag = ArtistDetailFragment.newInstance(it.artist, it.view.transitionName, it.view.width, it.view.height, it.imageUrl).apply {
sharedElementEnterTransition = MaterialContainerTransform()
}
supportFragmentManager.commit(true) {
addSharedElement(it.view, it.view.transitionName)
replace(R.id.content, targetFrag)
addToBackStack(null)
}
@PhongHuynh93
PhongHuynh93 / MaterialContainerTransform.java
Created July 4, 2021 07:45
MaterialContainerTransform
@Override
public void onTransitionEnd(@NonNull Transition transition) {
removeListener(this);
if (holdAtEndEnabled) {
// Keep drawable showing and views hidden (useful for Activity return transitions)
return;
}
// Show the actual views at the end of the transition
startView.setAlpha(1);
endView.setAlpha(1);
package com.umbrella.morphbutton
import android.animation.AnimatorSet
import android.animation.ArgbEvaluator
import android.animation.ValueAnimator
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
private fun runAnimation(isReverse: Boolean): AnimatorSet {
val values = if (isReverse) {
floatArrayOf(1f, 0f)
} else {
floatArrayOf(0f, 1f)
}
val animatorList = listOf(
ValueAnimator.ofFloat(*values).apply {
addUpdateListener {
colorBgFraction = it.animatedValue as Float