package org.ege.widget; import org.ege.utils.E; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.Actor; public class ProcessBar extends Actor{ ProcessBarStyle mStyle; TextureRegion tmp; OnProcessListener mProcessListener; // the first region width and height of process bar private float mFirstWidth; private float mFirstHeight; // the final width height when draw of process bar private float mDstWidth; private float mDstHeight; private float mCurrentTime; private float mCurrentPercent; private float mStateTime; private int mKeyFrame; boolean isAnimation = false; public ProcessBar(ProcessBarStyle style){ super(); readStyle(style); } private void readStyle(ProcessBarStyle style){ mStyle = style; mCurrentPercent = (style.mode == ProcessMode.COUNT_UP) ? 0 : 1; mCurrentTime = (style.mode == ProcessMode.COUNT_UP) ? 0 : mStyle.time; setRotation((style.orientation == E.orientation.LANDSCAPE) ? 0 : 90); mFirstWidth = mStyle.process[0].getRegionWidth(); mFirstHeight = mStyle.process[0].getRegionHeight(); } /************************************************************ * ***********************************************************/ public void setProcessListener(OnProcessListener listener){ mProcessListener = listener; } public void setMaxProcessTime(float maxProcessTime){ mStyle.time = maxProcessTime; } public void increaseProcess(float percent){ if(percent < 0 || percent > 1 || mCurrentPercent < 0 || mCurrentPercent > 1) return; mCurrentPercent += mStyle.mode.value * percent; if(mStyle.time > -1) mCurrentTime += mStyle.mode.value*percent*mStyle.time; if(mProcessListener != null) mProcessListener.ProcessValue(this, mCurrentPercent); mDstHeight = getHeight(); mDstWidth = mCurrentPercent * getWidth(); } public void setProcess(float currentPercent){ if(mCurrentPercent < 0 || mCurrentPercent > 1) return; mCurrentPercent = currentPercent; if(mStyle.time > -1) mCurrentTime = currentPercent*mStyle.time; mDstHeight = getHeight(); mDstWidth = mCurrentPercent * getWidth(); } public void setRegion(TextureRegion background,TextureRegion...process){ mStyle.background = background; mStyle.process = process; } public float getProcess(){ return mCurrentPercent; } public float getTime (){ return mCurrentTime; } /************************************************************ * ***********************************************************/ @Override public void draw (SpriteBatch batch, float parentAlpha) { final Color color = getColor(); batch.setColor(color.r, color.g, color.b, color.a); final float scaleX = getScaleX(); final float scaleY = getScaleY(); final float rotation = getRotation(); if(scaleX == 1 && scaleY == 1 && rotation == 0){ batch.draw(mStyle.background,getX(),getY(),getWidth(),getHeight()); tmp = mStyle.process[mKeyFrame]; tmp.setRegion((int)tmp.getRegionX(), (int)tmp.getRegionY(), (int)(mCurrentPercent*mFirstWidth), (int)mFirstHeight); batch.draw(tmp,getX(),getY(),mDstWidth,mDstHeight); }else{ batch.draw(mStyle.background,getX(),getY(),getOriginX(),getOriginY(),getWidth(),getHeight(),scaleX,scaleY,90); tmp = mStyle.process[mKeyFrame]; tmp.setRegion((int)tmp.getRegionX(), (int)tmp.getRegionY(), (int)(mCurrentPercent*mFirstWidth), (int)mFirstHeight); batch.draw(tmp,getX(),getY(),getOriginX(),getOriginY(),getWidth(),getHeight(),scaleX,scaleY,90); } } @Override public void act (float delta) { super.act(delta); if(isAnimation){ if(mStyle.time > 0 && mCurrentTime >= 0 && mCurrentTime <= mStyle.time){ mCurrentTime += mStyle.mode.value * delta; mCurrentPercent = mCurrentTime/mStyle.time; if(mProcessListener != null) mProcessListener.ProcessValue(this, mCurrentPercent); } mStateTime += delta; if(mStyle.frameduration > 0){ mKeyFrame = (int) (mStateTime/mStyle.frameduration); mKeyFrame = mKeyFrame % mStyle.process.length; }else mKeyFrame = 0; } } /************************************************************ * ***********************************************************/ public void startAnimation(){ isAnimation = true; } public void startAnimation(float frameDuration){ mStyle.frameduration = frameDuration; isAnimation = true; } public void stopAnimation(){ isAnimation = false; mStateTime = 0; mKeyFrame = 0; } public void reset(){ isAnimation = false; mStateTime= 0; mKeyFrame = 0; switch (mStyle.mode) { case COUNT_DOWN: mCurrentPercent = 1f; mCurrentTime = mStyle.time; break; case COUNT_UP: mCurrentPercent = 0f; mCurrentTime = 0; break; default: break; } } public boolean isAnimating(){ return isAnimation; } /************************************************************ * ***********************************************************/ public static class ProcessBarStyle { public TextureRegion background; public TextureRegion process[]; public float frameduration; // time = -1 mean dont use time public float time = -1; public ProcessMode mode = ProcessMode.COUNT_UP; public int orientation = E.orientation.LANDSCAPE; } public static interface OnProcessListener { public void ProcessValue(ProcessBar processBar,float currentPercent); } public static enum ProcessMode{ COUNT_UP(1), COUNT_DOWN(-1); final int value; private ProcessMode (int value) { this.value = value; } } }