Skip to content

Commit 0c2b20b

Browse files
committed
bug: 解决centerCrop问题 close #276
1 parent cb7418e commit 0c2b20b

3 files changed

Lines changed: 36 additions & 9 deletions

File tree

Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/mix/MixRender.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,11 @@
1515
*/
1616
package com.tencent.qgame.animplayer.mix
1717

18-
import android.graphics.Bitmap
1918
import android.opengl.GLES11Ext
2019
import android.opengl.GLES20
21-
import android.opengl.GLUtils
2220
import com.tencent.qgame.animplayer.AnimConfig
2321
import com.tencent.qgame.animplayer.Constant
2422
import com.tencent.qgame.animplayer.PointRect
25-
import com.tencent.qgame.animplayer.RenderConstant
2623
import com.tencent.qgame.animplayer.util.*
2724

2825
/**
@@ -63,7 +60,7 @@ class MixRender(private val mixAnimPlugin: MixAnimPlugin) {
6360
vertexArray.setVertexAttribPointer(shader.aPositionLocation)
6461

6562
// src 纹理坐标
66-
srcArray.setArray(genSrcCoordsArray(srcArray.array, frame.frame.w, frame.frame.h, src.w, src.h, src.fitType))
63+
srcArray.setArray(genSrcCoordsArray(srcArray.array, frame.frame.w, frame.frame.h, src.drawWidth, src.drawHeight, src.fitType))
6764
srcArray.setVertexAttribPointer(shader.aTextureSrcCoordinatesLocation)
6865
// 绑定 src纹理
6966
GLES20.glActiveTexture(GLES20.GL_TEXTURE0)
@@ -107,6 +104,9 @@ class MixRender(private val mixAnimPlugin: MixAnimPlugin) {
107104
}
108105
}
109106

107+
/**
108+
* CENTER_FULL 并不是严格的centerCrop(centerCrop已经前置处理),此处主要是为防抖动做处理,复杂遮罩情况下需要固定src大小进行绘制防止抖动
109+
*/
110110
private fun genSrcCoordsArray(array: FloatArray, fw: Int, fh: Int, sw: Int, sh: Int, fitType: Src.FitType): FloatArray {
111111
return if (fitType == Src.FitType.CENTER_FULL) {
112112
if (fw <= sw && fh <= sh) {

Android/PlayerProj/animplayer/src/main/java/com/tencent/qgame/animplayer/mix/Src.kt

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,21 @@ class Src {
5151
var srcId = ""
5252
var w = 0
5353
var h = 0
54+
var drawWidth = 0
55+
var drawHeight = 0
5456
var srcType = SrcType.UNKNOWN
5557
var loadType = LoadType.UNKNOWN
5658
var srcTag = ""
57-
var bitmap: Bitmap? = null
5859
var txt = ""
5960
var style = Style.DEFAULT
6061
var color: Int = 0
6162
var fitType = FitType.FIT_XY
6263
var srcTextureId = 0
64+
var bitmap: Bitmap? = null
65+
set(value) {
66+
field = value
67+
genDrawSize(value)
68+
}
6369

6470
constructor(json: JSONObject) {
6571
srcId = json.getString("srcId")
@@ -98,6 +104,29 @@ class Src {
98104
}
99105

100106

107+
private fun genDrawSize(bitmap: Bitmap?) {
108+
val bw = bitmap?.width?: w
109+
val bh = bitmap?.height?: h
110+
drawWidth = bw
111+
drawHeight = bh
112+
if (fitType == FitType.CENTER_FULL) {
113+
if (w == 0 || h == 0) {
114+
return
115+
}
116+
// 按src w h进行centerCrop处理
117+
val srcRate = w.toFloat() / h.toFloat()
118+
val bitmapRate = bw.toFloat() / bh.toFloat()
119+
120+
if (bitmapRate >= srcRate) {
121+
drawHeight = h
122+
drawWidth = (h * bitmapRate).toInt()
123+
} else {
124+
drawWidth = w
125+
drawHeight = (w / bitmapRate).toInt()
126+
}
127+
}
128+
}
129+
101130

102131
override fun toString(): String {
103132
return "Src(srcId='$srcId', srcType=$srcType, loadType=$loadType, srcTag='$srcTag', bitmap=$bitmap, txt='$txt')"

Android/PlayerProj/app/src/main/java/com/tencent/qgame/playerproj/player/AnimVapxDemoActivity.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,7 @@ class AnimVapxDemoActivity : Activity(), IAnimListener {
103103
* 比如:一个素材里需要显示多个头像,则需要定义多个不同的tag,表示不同位置,需要显示不同的头像,文字类似
104104
*/
105105
val srcTag = resource.tag
106-
107-
if (srcTag == "[sImg1]") { // 此tag是已经写入到动画配置中的tag
106+
if (srcTag.isNotEmpty()) {
108107
val drawableId = if (head1Img) R.drawable.head1 else R.drawable.head2
109108
head1Img = !head1Img
110109
val options = BitmapFactory.Options()
@@ -121,8 +120,7 @@ class AnimVapxDemoActivity : Activity(), IAnimListener {
121120
override fun fetchText(resource: Resource, result: (String?) -> Unit) {
122121
val str = "恭喜 No.${1000 + Random().nextInt(8999)}用户 升神"
123122
val srcTag = resource.tag
124-
125-
if (srcTag == "[sTxt1]") { // 此tag是已经写入到动画配置中的tag
123+
if (srcTag.isNotEmpty()) { // 此tag是已经写入到动画配置中的tag
126124
result(str)
127125
} else {
128126
result(null)

0 commit comments

Comments
 (0)