debug_fix_screen_change #2
@@ -82,7 +82,7 @@ void android_main(struct android_app *pApp) {
|
|||||||
auto frameTime = end_time - last_update_time;
|
auto frameTime = end_time - last_update_time;
|
||||||
last_update_time = end_time;
|
last_update_time = end_time;
|
||||||
auto function_time = (end_time - start_time);
|
auto function_time = (end_time - start_time);
|
||||||
aout << "function_time:" << function_time << " fps:" << (1000/frameTime) << std::endl;
|
//aout << "function_time:" << function_time << " fps:" << (1000/frameTime) << std::endl;
|
||||||
if(function_time < 35)
|
if(function_time < 35)
|
||||||
{
|
{
|
||||||
this_thread::sleep_for(chrono::milliseconds((35-function_time)));
|
this_thread::sleep_for(chrono::milliseconds((35-function_time)));
|
||||||
@@ -246,7 +246,18 @@ extern "C"
|
|||||||
JNIEXPORT jstring JNICALL
|
JNIEXPORT jstring JNICALL
|
||||||
Java_com_hmwl_face_1sdk_FaceActivity_PreReadAction(JNIEnv *env, jobject thiz, jstring motion,
|
Java_com_hmwl_face_1sdk_FaceActivity_PreReadAction(JNIEnv *env, jobject thiz, jstring motion,
|
||||||
jobject callback) {
|
jobject callback) {
|
||||||
g_callback = env->NewGlobalRef(callback);
|
// 清理旧的全局引用
|
||||||
|
if (g_callback != nullptr) {
|
||||||
|
env->DeleteGlobalRef(g_callback);
|
||||||
|
g_callback = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存新的回调
|
||||||
|
if (callback != nullptr) {
|
||||||
|
g_callback = env->NewGlobalRef(callback);
|
||||||
|
} else {
|
||||||
|
g_callback = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
const char *nativeString = env->GetStringUTFChars(motion, nullptr);
|
const char *nativeString = env->GetStringUTFChars(motion, nullptr);
|
||||||
jsize len = env->GetStringUTFLength(motion);
|
jsize len = env->GetStringUTFLength(motion);
|
||||||
@@ -254,12 +265,7 @@ Java_com_hmwl_face_1sdk_FaceActivity_PreReadAction(JNIEnv *env, jobject thiz, js
|
|||||||
{
|
{
|
||||||
aout << "ArgLen to long:" << len << std::endl;
|
aout << "ArgLen to long:" << len << std::endl;
|
||||||
}
|
}
|
||||||
if(g_Application->isInited())
|
|
||||||
{
|
|
||||||
g_Application->changeMotion(nativeString);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: implement PreReadAction()
|
|
||||||
std::string ret = g_Application->preReadyMotion(nativeString, CppCallback);
|
std::string ret = g_Application->preReadyMotion(nativeString, CppCallback);
|
||||||
return env->NewStringUTF(ret.c_str());
|
return env->NewStringUTF(ret.c_str());
|
||||||
}
|
}
|
||||||
@@ -282,7 +282,7 @@ public class FaceActivity extends GameActivity implements FaceLandmarkerHelper.L
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected native void ChangeStateCpp(String json);
|
protected native void ChangeStateCpp(String json);
|
||||||
protected void ChangeState(String json){
|
protected void ChangeMotion(String json){
|
||||||
Log.i("FaceActivity", "ChangeState:" + json);
|
Log.i("FaceActivity", "ChangeState:" + json);
|
||||||
ChangeStateCpp(json);
|
ChangeStateCpp(json);
|
||||||
}
|
}
|
||||||
@@ -291,6 +291,6 @@ public class FaceActivity extends GameActivity implements FaceLandmarkerHelper.L
|
|||||||
@Override
|
@Override
|
||||||
public void onEmpty() {
|
public void onEmpty() {
|
||||||
// 当没有检测到人脸时的处理逻辑
|
// 当没有检测到人脸时的处理逻辑
|
||||||
Log.d(TAG, "No face detected in the current frame");
|
//Log.d(TAG, "No face detected in the current frame");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,6 @@ import android.widget.Toast
|
|||||||
import com.hmwl.face_sdk.FaceActivity
|
import com.hmwl.face_sdk.FaceActivity
|
||||||
import com.hmwl.face_sdk.InitArg
|
import com.hmwl.face_sdk.InitArg
|
||||||
import com.hmwl.face_sdk.Motion
|
import com.hmwl.face_sdk.Motion
|
||||||
import org.json.JSONArray
|
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import java.io.BufferedReader
|
import java.io.BufferedReader
|
||||||
import java.io.InputStreamReader
|
import java.io.InputStreamReader
|
||||||
@@ -17,11 +16,11 @@ import java.io.InputStreamReader
|
|||||||
|
|
||||||
class MakeupActivity : FaceActivity()
|
class MakeupActivity : FaceActivity()
|
||||||
{
|
{
|
||||||
|
|
||||||
private var curIndex = 0
|
private var curIndex = 0
|
||||||
private var pngFilesByFolder: List<FolderInfo>? = null
|
private var pngFilesByFolder: List<FolderInfo>? = null
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
|
||||||
FaceInit(this)
|
FaceInit(this)
|
||||||
|
|
||||||
val initArg = InitArg().apply {
|
val initArg = InitArg().apply {
|
||||||
@@ -34,13 +33,15 @@ class MakeupActivity : FaceActivity()
|
|||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
var motion = getMotionByIndex(0);
|
var motion = getMotionByIndex(0);
|
||||||
var jsonString = motion.toJson()
|
var motionJsonString = motion.toJson()
|
||||||
val result = PreLoadAction(jsonString) { motion_type ->
|
val result = PreLoadAction(motionJsonString,object : CallbackInterface {
|
||||||
// 在这里处理回调结果
|
override fun OnLoadActionFinished(motion_type: String) {
|
||||||
println("OnLoadActionFinished: $motion_type")
|
//加载完成后,切断到对应的动画
|
||||||
ChangeState(motion_type);
|
Log.i("info","加载完成后,切换到对应的动画")
|
||||||
}
|
ChangeMotion(motion_type)
|
||||||
//Toast.makeText(this, "4.png", Toast.LENGTH_LONG).show()
|
}
|
||||||
|
})
|
||||||
|
Toast.makeText(this, "开始加载动画: $result", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getMotionByIndex(index: Int): Motion {
|
private fun getMotionByIndex(index: Int): Motion {
|
||||||
@@ -65,31 +66,45 @@ class MakeupActivity : FaceActivity()
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var nextMotionLoadFinished = false
|
||||||
|
var nextMotionType = ""
|
||||||
override fun onTouchEvent(event: MotionEvent): Boolean {
|
override fun onTouchEvent(event: MotionEvent): Boolean {
|
||||||
when (event.action) {
|
when (event.action) {
|
||||||
MotionEvent.ACTION_DOWN -> {
|
MotionEvent.ACTION_DOWN -> {
|
||||||
Log.d("TouchEvent", "手指按下 - X: ${event.x}, Y: ${event.y}")
|
|
||||||
if(curIndex == 31)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MotionEvent.ACTION_MOVE -> {
|
|
||||||
Log.d("TouchEvent", "手指移动 - X: ${event.x}, Y: ${event.y}")
|
|
||||||
}
|
|
||||||
MotionEvent.ACTION_UP -> {
|
|
||||||
Log.d("TouchEvent", "手指抬起")
|
|
||||||
curIndex++
|
|
||||||
pngFilesByFolder?.let { folders ->
|
pngFilesByFolder?.let { folders ->
|
||||||
if (curIndex > folders.size - 1) {
|
if (curIndex > folders.size - 1) {
|
||||||
|
//动画播放完成,切换到主界面
|
||||||
curIndex = 0
|
curIndex = 0
|
||||||
Stop();
|
Stop();
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
ChangeState(getCurMotionState(curIndex))
|
|
||||||
Toast.makeText(this, folders[curIndex].folderName, Toast.LENGTH_LONG).show()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MotionEvent.ACTION_UP -> {
|
||||||
|
if (!nextMotionLoadFinished)
|
||||||
|
{
|
||||||
|
var nextMotion = getMotionByIndex(curIndex + 1);
|
||||||
|
var json_str = nextMotion.toJson()
|
||||||
|
PreLoadAction(json_str,object : CallbackInterface {
|
||||||
|
override fun OnLoadActionFinished(motion_type: String) {
|
||||||
|
Log.i("info","加载完成后,还会继续播放当前的动画,可以手动切换动画")
|
||||||
|
nextMotionLoadFinished = true;
|
||||||
|
nextMotionType = motion_type;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
Toast.makeText(this, "开始加载下一个动画 ${nextMotion.type}", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//手动切换动画
|
||||||
|
ChangeMotion(nextMotionType);
|
||||||
|
nextMotionLoadFinished = false;
|
||||||
|
curIndex++;
|
||||||
|
Toast.makeText(this, "切换到下一个动画 $nextMotionType", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -1371,12 +1371,13 @@ void FaceApp::changeMotion(const string motion_type)
|
|||||||
|
|
||||||
std::unique_lock<std::mutex> lock_changeMotion(changeMotionMtx);
|
std::unique_lock<std::mutex> lock_changeMotion(changeMotionMtx);
|
||||||
|
|
||||||
for (int i = 0; i < this->m_texs.size(); ++i)
|
|
||||||
|
for (int i = 0; i < _nextMotion.png_names.size(); ++i)
|
||||||
{
|
{
|
||||||
destroyTexture(device, m_texs[i]);
|
destroyTexture(device, m_texs[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < m_texs_next.size(); ++i)
|
for (int i = 0; i < _nextMotion.png_names.size(); ++i)
|
||||||
{
|
{
|
||||||
m_texs[i] = m_texs_next[i];
|
m_texs[i] = m_texs_next[i];
|
||||||
m_texs_next[i].reset();
|
m_texs_next[i].reset();
|
||||||
@@ -1385,6 +1386,7 @@ void FaceApp::changeMotion(const string motion_type)
|
|||||||
update_descriptor_set(m_texs);
|
update_descriptor_set(m_texs);
|
||||||
_curMotion_type = motion_type;
|
_curMotion_type = motion_type;
|
||||||
_curMotion_png_size = _nextMotion.png_names.size();
|
_curMotion_png_size = _nextMotion.png_names.size();
|
||||||
|
_motionState = ready;
|
||||||
|
|
||||||
|
|
||||||
// for (int i = 0; i < _curMotion.png_names.size(); ++i)
|
// for (int i = 0; i < _curMotion.png_names.size(); ++i)
|
||||||
|
|||||||
Reference in New Issue
Block a user