如何在android中使用动画绘制视图?
我想画像这样的动画图像视图。首先,我想画圆,然后眼睛,然后嘴(拱状视图)与平滑动画。我们能实现这样的动画吗。在这里,我得到的问题,定位视图眼睛和弧形嘴 请试试这个 >AnimView.java如何在android中使用动画绘制视图?,android,view,android-animation,Android,View,Android Animation,我想画像这样的动画图像视图。首先,我想画圆,然后眼睛,然后嘴(拱状视图)与平滑动画。我们能实现这样的动画吗。在这里,我得到的问题,定位视图眼睛和弧形嘴 请试试这个 >AnimView.java import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import and
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.SurfaceHolder.Callback;
public class AnimView extends SurfaceView implements Runnable,
Callback {
Paint paint = new Paint();
Thread thread = null;
SurfaceHolder surfaceHolder;
boolean running=false;
long time=0;
int pos=0;
public AnimView(Context context) {
super(context);
paint.setColor(Color.GREEN);
surfaceHolder = getHolder();
}
public AnimView(Activity context) {
// TODO Auto-generated constructor stub
super(context);
paint.setColor(Color.GREEN);
surfaceHolder = getHolder();
}
public void onResumeMySurfaceView() {
thread = new Thread(AnimView.this);
thread.start();
running=true;
}
public void onPauseMySurfaceView() {
boolean retry = true;
running = false;
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}
}
}
// @Override
// public void onDraw(Canvas canvas) {
// canvas.drawLine(0, 0, 20, 20, paint);
// canvas.drawLine(20, 0, 0, 20, paint);
// Log.i("onDraw","Draw");
//
// }
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
@Override
public void run() {
// TODO Auto-generated method stub
while(running)
{
if(time==0)
{
time=System.currentTimeMillis();
pos=0;
}
if((System.currentTimeMillis()-time) >3000)
{
pos=1;
}
if((System.currentTimeMillis()-time) >6000)
{
pos=2;
}
if((System.currentTimeMillis()-time) >9000)
{
pos=3;
}
if((System.currentTimeMillis()-time) >12000)
{
pos=0;
time=System.currentTimeMillis();
}
Canvas canvas = surfaceHolder.lockCanvas();
if(canvas!=null)
{
paint.setColor(Color.WHITE);
canvas.drawRect(0, 0, this.getWidth(),this.getHeight(), paint);
if(pos>0)
{
paint.setColor(Color.GREEN);
canvas.drawCircle(200, 200, 50, paint);
paint.setColor(Color.WHITE);
canvas.drawCircle(200, 200, 48, paint);
}
if(pos>1)
{
paint.setColor(Color.GREEN);
canvas.drawCircle(175, 185, 5, paint);
canvas.drawCircle(225, 185, 5, paint);
}
if(pos>2)
{
paint.setStrokeWidth(5);
// opacity
//p.setAlpha(0x80); //
RectF rectF = new RectF(160, 160, 240, 240);
canvas.drawArc (rectF, 45, 135, true, paint);
rectF = new RectF(159, 159, 238, 238);
paint.setColor(Color.WHITE);
canvas.drawArc (rectF, 35, 145, true, paint);
}
surfaceHolder.unlockCanvasAndPost(canvas);
}
Log.i("onDraw","Draw");
}
}
}
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
AnimView av;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
av=new AnimView(this);
setContentView(av);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
av.onPauseMySurfaceView();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
av.onResumeMySurfaceView();
}
}
>MainActivity.java
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.SurfaceHolder.Callback;
public class AnimView extends SurfaceView implements Runnable,
Callback {
Paint paint = new Paint();
Thread thread = null;
SurfaceHolder surfaceHolder;
boolean running=false;
long time=0;
int pos=0;
public AnimView(Context context) {
super(context);
paint.setColor(Color.GREEN);
surfaceHolder = getHolder();
}
public AnimView(Activity context) {
// TODO Auto-generated constructor stub
super(context);
paint.setColor(Color.GREEN);
surfaceHolder = getHolder();
}
public void onResumeMySurfaceView() {
thread = new Thread(AnimView.this);
thread.start();
running=true;
}
public void onPauseMySurfaceView() {
boolean retry = true;
running = false;
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}
}
}
// @Override
// public void onDraw(Canvas canvas) {
// canvas.drawLine(0, 0, 20, 20, paint);
// canvas.drawLine(20, 0, 0, 20, paint);
// Log.i("onDraw","Draw");
//
// }
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
@Override
public void run() {
// TODO Auto-generated method stub
while(running)
{
if(time==0)
{
time=System.currentTimeMillis();
pos=0;
}
if((System.currentTimeMillis()-time) >3000)
{
pos=1;
}
if((System.currentTimeMillis()-time) >6000)
{
pos=2;
}
if((System.currentTimeMillis()-time) >9000)
{
pos=3;
}
if((System.currentTimeMillis()-time) >12000)
{
pos=0;
time=System.currentTimeMillis();
}
Canvas canvas = surfaceHolder.lockCanvas();
if(canvas!=null)
{
paint.setColor(Color.WHITE);
canvas.drawRect(0, 0, this.getWidth(),this.getHeight(), paint);
if(pos>0)
{
paint.setColor(Color.GREEN);
canvas.drawCircle(200, 200, 50, paint);
paint.setColor(Color.WHITE);
canvas.drawCircle(200, 200, 48, paint);
}
if(pos>1)
{
paint.setColor(Color.GREEN);
canvas.drawCircle(175, 185, 5, paint);
canvas.drawCircle(225, 185, 5, paint);
}
if(pos>2)
{
paint.setStrokeWidth(5);
// opacity
//p.setAlpha(0x80); //
RectF rectF = new RectF(160, 160, 240, 240);
canvas.drawArc (rectF, 45, 135, true, paint);
rectF = new RectF(159, 159, 238, 238);
paint.setColor(Color.WHITE);
canvas.drawArc (rectF, 35, 145, true, paint);
}
surfaceHolder.unlockCanvasAndPost(canvas);
}
Log.i("onDraw","Draw");
}
}
}
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
AnimView av;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
av=new AnimView(this);
setContentView(av);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
av.onPauseMySurfaceView();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
av.onResumeMySurfaceView();
}
}
用下面的代码Canvas c=newcanvas(bmp)很容易画出圆圈;c、 drawCircle(cx、cy、半径、绘制),但动画不平滑。我想用同样的方法画视图,但要用动画,比如用铅笔画。你对此有什么建议吗。感谢您的快速回复,因为这在某种程度上帮助了我。您可以通过实现一点编程逻辑使其变得更平滑,只需创建所需的路径并根据时间绘制。@ArashAtaAfarin解决方案只是绘制圆并将图像放置在圆的中心。就这样。