Android/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/SrcImage.java

174 lines
7.1 KiB
Java
Raw Normal View History

2024-01-24 20:17:59 +08:00
package com.xixun.xixunplayer;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.Choreographer;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import gnph.util.JSList;
import gnph.util.JSMap;
public class SrcImage extends View implements Choreographer.FrameCallback {
static final char effTypes[] = {'l', 't', 'r', 'b'};
Bitmap img;
Rect RECT = new Rect();
RectF rect;
Paint paint = new Paint();
int entryDur, exitStart;
char entryType, exitType;
boolean isEntryRand, isExitRand;
public SrcImage(Context context, JSMap map, int w, int h) {
super(context);
RECT.right = w;
RECT.bottom = h;
img = BitmapFactory.decodeFile(Util.programDir+"/"+map.stnn("id"));
if(img==null) return;
rect = new RectF(0, 0, w, h);
// entryDur = map.intg("entryEffectTimeSpan")*60;
// if(entryDur > 0) {
// var effStr = map.str("entryEffect");
// if(effStr == null || effStr.equalsIgnoreCase("None")) entryDur = 0;
// else if(effStr.equalsIgnoreCase("moving_left")) entryType = 'l';
// else if(effStr.equalsIgnoreCase("moving_top")) entryType = 't';
// else if(effStr.equalsIgnoreCase("moving_right")) entryType = 'r';
// else if(effStr.equalsIgnoreCase("moving_bottom")) entryType = 'b';
// else if(effStr.equalsIgnoreCase("alpha_in")) entryType = 'a';
// else if(effStr.equalsIgnoreCase("zoom_in")) entryType = 'z';
// else if(effStr.equalsIgnoreCase("Random")) isEntryRand = true;
// else entryDur = 0;
// }
// var exitDur = map.intg("exitEffectTimeSpan")*60;
// if(exitDur > 0) {
// var effStrExit = map.str("exitEffect");
// if(effStrExit == null || effStrExit.equalsIgnoreCase("None")) exitDur = 0;
// else if(effStrExit.equalsIgnoreCase("moving_left")) exitType = 'l';
// else if(effStrExit.equalsIgnoreCase("moving_top")) exitType = 't';
// else if(effStrExit.equalsIgnoreCase("moving_right")) exitType = 'r';
// else if(effStrExit.equalsIgnoreCase("moving_bottom")) exitType = 'b';
// else if(effStrExit.equalsIgnoreCase("alpha_out")) exitType = 'a';
// else if(effStrExit.equalsIgnoreCase("zoom_out")) exitType = 'z';
// else if(effStrExit.equalsIgnoreCase("Random")) isExitRand = true;
// else exitDur = 0;
// }
// exitStart = exitDur==0 ? Integer.MAX_VALUE : map.intg("timeSpan")*60 - exitDur;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawOther(canvas, this);
}
public void drawOther(Canvas canvas, View view) {
// var fff = ff==0 ? 0 : ff-1;
// if(fff < entryDur) {
// if(entryType=='l') {
// rect.left = RECT.right - fff*RECT.right/(float) entryDur;
// rect.right = rect.left + RECT.right;
// canvas.drawBitmap(img, null, rect, null);
// } else if(entryType=='r') {
// rect.left = -RECT.right + fff*RECT.right/(float) entryDur;
// rect.right = rect.left + RECT.right;
// canvas.drawBitmap(img, null, rect, null);
// } else if(entryType=='t') {
// rect.top = RECT.bottom - fff*RECT.bottom/(float) entryDur;
// rect.bottom = rect.top + RECT.bottom;
// canvas.drawBitmap(img, null, rect, null);
// } else if(entryType=='b') {
// rect.top = -RECT.bottom + fff*RECT.bottom/(float) entryDur;
// rect.bottom = rect.top + RECT.bottom;
// canvas.drawBitmap(img, null, rect, null);
// } else if(entryType=='a') {
// paint.setAlpha(fff*255/entryDur);
// canvas.drawBitmap(img, null, rect, paint);
// } else if(entryType=='z') {
// var haw = RECT.right/2f;
// var hah = RECT.bottom/2f;
// var ww = fff*haw/(float) entryDur;
// var hh = fff*hah/(float) entryDur;
// rect.left = haw - ww;
// rect.right = haw + ww;
// rect.top = hah - hh;
// rect.bottom = hah + hh;
// canvas.drawBitmap(img, null, rect, null);
// }
// } else if(fff>=exitStart) {
// fff -= exitStart;
// if(exitType=='l') {
// rect.left = - fff*RECT.right/(float) entryDur;
// rect.right = rect.left + RECT.right;
// canvas.drawBitmap(img, null, rect, null);
// } else if(exitType=='r') {
// rect.left = fff*RECT.right/(float) entryDur;
// rect.right = rect.left + RECT.right;
// canvas.drawBitmap(img, null, rect, null);
// } else if(exitType=='t') {
// rect.top = - fff*RECT.bottom/(float) entryDur;
// rect.bottom = rect.top + RECT.bottom;
// canvas.drawBitmap(img, null, rect, null);
// } else if(exitType=='b') {
// rect.top = fff*RECT.bottom/(float) entryDur;
// rect.bottom = rect.top + RECT.bottom;
// canvas.drawBitmap(img, null, rect, null);
// } else if(exitType=='a') {
// paint.setAlpha(255 - fff*255/entryDur);
// canvas.drawBitmap(img, null, rect, paint);
// } else if(exitType=='z') {
// var haw = RECT.right/2f;
// var hah = RECT.bottom/2f;
// var ww = haw - fff*haw/(float) entryDur;
// var hh = hah - fff*hah/(float) entryDur;
// rect.left = haw - ww;
// rect.right = haw + ww;
// rect.top = hah - hh;
// rect.bottom = hah + hh;
// canvas.drawBitmap(img, null, rect, null);
// }
// } else
canvas.drawBitmap(img, null, RECT, null);
}
Choreographer choreographer = Choreographer.getInstance();
int ff;
boolean canAdd = true;
// @Override
// public void onVisibilityAggregated(boolean isVisible) {
// super.onVisibilityAggregated(isVisible);
// ff = 0;
// if(isVisible) {
// if(canAdd && (entryDur > 0 || exitStart < Integer.MAX_VALUE)) {
// choreographer.postFrameCallback(this);
// canAdd = false;
// }
// }
// }
@Override
public void doFrame(long frameTimeNanos) {
if(! isShown()) {
canAdd = true;
return;
}
if(ff <= entryDur || ff>=exitStart) {
if(ff==0) {
if(isEntryRand) entryType = effTypes[Util.rand.nextInt(4)];
if(isExitRand) exitType = effTypes[Util.rand.nextInt(4)];
}
invalidate();
}
ff++;
choreographer.postFrameCallback(this);
canAdd = false;
}
}