public class MainActivity extends Activity {
private boolean suspend = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setBackgroundResource(R.drawable.imagelong2);
final ClipDrawable drawable = (ClipDrawable) imageView.getDrawable();
ToggleButton toggleButton = (ToggleButton) findViewById(R.id.togbtn);
toggleButton.setText("播放");
toggleButton.setTextOn("暂停");
toggleButton.setTextOff("播放");
toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (suspend == true) {
//获取图片所显示的ClipDrawable对象
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if (msg.what == 0x123) {
drawable.setLevel(drawable.getLevel() + 1);
}
}
};
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Message msg = new Message();
msg.what = 0x123;
handler.sendMessage(msg);
if (drawable.getLevel() >= 10000) {
timer.cancel();
}
}
}, 0, 1);
suspend = false;
if (suspend == false) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
suspend = true;
}
}
});
}
}
写了一个 ClipDrawable的进度条 想控制暂停让线程等待出现错误Skipped 127 frames! The application may be doing too much work on its main thread. 只有加了Thread.sleep(2000);以后在有这个问题,会很卡,请问我这个要怎么改啊
setContentView(R.layout.activity_main);
final ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setBackgroundResource(R.drawable.imagelong2);
final ClipDrawable drawable = (ClipDrawable) imageView.getDrawable();
ToggleButton toggleButton = (ToggleButton) findViewById(R.id.togbtn);
toggleButton.setText("播放");
toggleButton.setTextOn("暂停");
toggleButton.setTextOff("播放");
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x123) {
drawable.setLevel(drawable.getLevel() + 1);
if (drawable.getLevel() >= 10000) {
//不再发送message
} else{
Message nextMsg = Message.obtain(this, 0x123);
sendMessage(nextMsg);
}
}
}
};
toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//获取图片所显示的ClipDrawable对象
Message nextMsg = Message.obtain(handler, 0x123);
handler.sendMessage(nextMsg);
}
});
修改成这样试试
代码出现了错误,改一下就很高了
你是只点击了一下就显示Skipped 127 frames这个了?
boolean isSuspend = false;
long mStartTime;
int mDuration;
private Interpolator mAnimationInterpolator = new LinearInterpolator();
private IntEvaluator mAnimationEvaluator = new IntEvaluator();
private int mEnd;
private int mStart;
private final static int DEFAULT_DURATION = 10000;
final ClipDrawable clipDrawable = new ClipDrawable(getResources().getDrawable(R.drawable.test), Gravity.LEFT, ClipDrawable.HORIZONTAL);
ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setImageDrawable(clipDrawable);
clipDrawable.setLevel(10000);
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x102) {
float input = ((float)(SystemClock.elapsedRealtime() - mStartTime)) / mDuration;
if(input > 1.0f){
clipDrawable.setLevel(mEnd);
isSuspend = true;
// sendEmptyMessage(0x103);
} else{
float fraction = mAnimationInterpolator.getInterpolation(input);
int value = mAnimationEvaluator.evaluate(fraction, mStart, mEnd);
clipDrawable.setLevel(value);
sendEmptyMessage(0x102);
}
} else if(msg.what == 0x101){//start
if((Boolean)(msg.obj)) {
clipDrawable.setLevel(0);
mStartTime = SystemClock.elapsedRealtime();
mDuration = DEFAULT_DURATION;
mStart = 0;
mEnd = 10000;
} else{
//继续前面的动画
mStartTime = SystemClock.elapsedRealtime();
mStart = clipDrawable.getLevel();
mEnd = 10000;
}
sendEmptyMessage(0x102);
} else if(msg.what == 0x103){//end 这里的处理是重启动画
Message nextMsg = Message.obtain(this, 0x101);
nextMsg.obj = true;
sendMessage(nextMsg);
}
}
};
isSuspend = true;
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isSuspend){
if(clipDrawable.getLevel() <= 0 || clipDrawable.getLevel() >= 10000){//重新开始
Message nextMsg = Message.obtain(handler, 0x101);
nextMsg.obj = true;
handler.sendMessage(nextMsg);
} else{
Message nextMsg = Message.obtain(handler, 0x101);
nextMsg.obj = false;
handler.sendMessage(nextMsg);
}
isSuspend = false;
} else{
handler.removeMessages(0x101);
handler.removeMessages(0x102);
handler.removeMessages(0x103);
//计算当前已经走过的时间
mDuration = mDuration - (int)(SystemClock.elapsedRealtime() - mStartTime);
isSuspend = true;
}
}
});
我修改了一下 这样就可以控制时间而且可以点击停止再点击启动了
这个问题是有根本性原因的,因为view的刷新限制,为了在16ms,即fps=60的情况下刷新页面,如果操作大于16ms,就会爆出这个错误,并且延迟本次刷新
等下一次的16ms,所以想解决这个原因开子线程吧