android实现按钮拖动效果及路径的绘制等2D绘图功能---待完善

来源:互联网 发布:linux awk 指定匹配列 编辑:程序博客网 时间:2024/05/19 08:41

1.MainActivity.java

package com.example.tracepath;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

 //tracePathView tpView;
 Button btnStartTrace;
 Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnStartTrace = (Button)this.findViewById(R.id.btnStartTrace);
        btnStartTrace.setOnClickListener(new Button.OnClickListener()
        {
         @Override
         public void onClick(View v)
         {
          //Toast.makeText(getApplicationContext(), "欢迎:"+txtName.getText().toString(), Toast.LENGTH_SHORT).show();
          intent = new Intent(MainActivity.this,ShowActivity.class);
          startActivity(intent);
         }
        }
          );
       
    }


    @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;
    }
 
}

--------------------

2.ShowActivity.java

package com.example.tracepath;

import java.io.File;
import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Path;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.AbsoluteLayout;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;

public class ShowActivity extends Activity{

 tracePathView tpView;

 Button btnStart;
 static int x = 10;
 static int y = 200;
 static int width = 300;
 static int height = 50;
 
 ListView lv ;//必须在外部实例化,不能在onCreate中new!button可以
 //BitmapFactory.decodeStream(is, outPadding, opts);
 //BitmapFactory.decodeResource(this.getResources(), R.drawable.building);
// Bitmap bm = BitmapFactory.decodeResource(this.getContext().getResources(), R.drawable.building);
// Canvas canvas = null;
 //this.getInputStream();
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //setContentView(R.layout.activity_tracepath);
  
  btnStart = new Button(this);
  btnStart.setText("Click");
  btnStart.setWidth(20);
  btnStart.setHeight(20);
  
  Toast.makeText(getApplicationContext(),"begin new listView", 1500).show();
  //显示列表
  lv = new ListView(this);
  String[] arr = {"孙悟空","猪八戒","沙和尚"};
  //将数组包装到ArrayAdapter
  final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_2,arr);
  
  lv.setAdapter(arrayAdapter);
  
  Toast.makeText(getApplicationContext(),"end new listView", 1500).show();
  
  //--------------测试拖动效果begin--------------
  DisplayMetrics dm = getResources().getDisplayMetrics();
  final int screenWidth = dm.widthPixels;
  final int screenHeight = dm.heightPixels - 50;

  
  btnStart.setOnLongClickListener(new View.OnLongClickListener() {
   
   @Override
   public boolean onLongClick(View arg0) {
    // TODO Auto-generated method stub
    Toast.makeText(getApplicationContext(),"你怎么一直按我,呜呜~~~~", 1500).show();
    //弹出菜单的功能
    //ListView lv;
    //String[] arr = {"孙悟空","猪八戒","沙和尚"};
    //将数组包装到ArrayAdapter
    //ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_2,arr);
    //lv.setAdapter(arrayAdapter);
    
    return false;
   }
  });
  btnStart.setOnTouchListener(new OnTouchListener(){

   int lastX, lastY;

   @Override
   public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    int ea=event.getAction();
    Log.i("TAG", "Touch:"+ea);

    //Toast.makeText(DraftTest.this, "位置:"+x+","+y, Toast.LENGTH_SHORT).show();

    switch(ea){
    case MotionEvent.ACTION_DOWN:
     lastX = (int) event.getRawX();
     lastY = (int) event.getRawY();
     break;
     /**
      * layout(l,t,r,b)
      * l  Left position, relative to parent
                      t  Top position, relative to parent
                      r  Right position, relative to parent
                      b  Bottom position, relative to parent 
      * */
    case MotionEvent.ACTION_MOVE:
     int dx =(int)event.getRawX() - lastX;
     int dy =(int)event.getRawY() - lastY;

     int left = v.getLeft() + dx;
     int top = v.getTop() + dy;
     int right = v.getRight() + dx;
     int bottom = v.getBottom() + dy;

     if(left < 0){
      left = 0;
      right = left + v.getWidth();
     }

     if(right > screenWidth){
      right = screenWidth;
      left = right - v.getWidth();
     }

     if(top < 0){
      top = 0;
      bottom = top + v.getHeight();
     }

     if(bottom > screenHeight){
      bottom = screenHeight;
      top = bottom - v.getHeight();
     }

     v.layout(left, top, right, bottom);

     Log.i("", "position:" + left +", " + top + ", " + right + ", " + bottom);

     lastX = (int) event.getRawX();
     lastY = (int) event.getRawY();

     break;
    case MotionEvent.ACTION_UP:
     break;          
    }
    return false;
   }});
  //--------------测试拖动效果end--------------

  tpView = new tracePathView(this);
  
  //LinearLayout layout = new LinearLayout(this);
  AbsoluteLayout layout = new AbsoluteLayout(this);
  //layout.setOrientation(LinearLayout.VERTICAL);
  //layout.addView(btnStart);
  
  layout.addView(tpView);
  layout.addView(btnStart, 60,60);
  //layout.addView(lv);
  
  setContentView(layout);
  
  final Handler myHandler = new Handler()
  {
   @Override
   public void handleMessage(Message msg)
   {
    //如果消息是本程序发送的
    if(msg.what == 0x1233)
    {
     if(!tpView.setPos(x, y, width, height))
     {
      x=10;
      y=200;
     }
     //getView(tpView); 
     setBtnPost(x,y);
    }
   }
  };
  new Timer().schedule(new TimerTask()
  {
   @Override
   public void run()
   {
    x+=3;
    y+=3;
    myHandler.sendEmptyMessage(0x1233);
   }
  }, 0, 1200);
 }


 @SuppressLint("NewApi") public void setBtnPost(int x,int y)
 {
  btnStart.setX(x);
  btnStart.setY(y);
 }
 
 @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;
 }
}

 

------------------

3.tracePathView.java

package com.example.tracepath;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ComposePathEffect;
import android.graphics.CornerPathEffect;
import android.graphics.DashPathEffect;
import android.graphics.DiscretePathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathDashPathEffect;
import android.graphics.PathEffect;
import android.graphics.RectF;
import android.graphics.SumPathEffect;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class tracePathView extends View{


 //测试3:
 Bitmap bm = BitmapFactory.decodeResource(this.getContext().getResources(), R.drawable.building);
 Bitmap bmPerson = BitmapFactory.decodeResource(this.getContext().getResources(), R.drawable.person);
 //Canvas canvas = null;
 int g_x = 10;
 int g_y = 200;
 int g_width = bm.getWidth();
 int g_height = bm.getHeight();
 boolean g_bGoHead = true;
 
 
 Path path;
 Paint paint;
 
 //测试之用
 float phase;
 PathEffect effects = new PathEffect();
 int colors;
 
 //Button btn;
 
 //private ShapeDrawable mDrawable;
 public tracePathView(Context context)
 {
  super(context);

  int width = 300;
  int height = 50;

  //btn.setText("hello world!");
  //Button btn;
  paint = new Paint();
  //paint.setAlpha(90);
  paint.setAntiAlias(true);
  paint.setColor(Color.BLUE);
  paint.setStyle(Paint.Style.STROKE);
  paint.setStrokeWidth(3);

  path = new Path();
  path.moveTo(g_x, g_y);
  
  colors = Color.BLUE;
  
 }

 //返回值表示绘制对象是否在控制范围内,从而用来控制传递的参数的值的范围
 public boolean setPos(int x,int y,int width,int height)
 {
  g_x = x;
  g_y = y;
  
  if(x > 10+g_width )
  {
   g_x = 10;
   return false;
  }

  if(y > 200+g_height)
  {
   g_y = 200;
   return false;
  }
  path.lineTo(g_x, g_y);
  this.invalidate();
  return true;
 }
 protected void onDraw(Canvas canvas)
 {
  canvas.save();
  canvas.drawBitmap(bm, 10, 200,null);
  canvas.drawBitmap(bmPerson, g_x, g_y, null);
  
  //测试之用
  paint.setPathEffect(effects);
  paint.setColor(colors);
  canvas.drawPath(path, paint);
  
   
  canvas.restore();
 }
}

 

待解决:

1.如何实现长按按钮弹出菜单或ListView的功能

 

------------------------------------

参考1:

http://www.iteye.com/topic/1116001

参考2:

http://android.tgbus.com/Android/tutorial/201108/365905.shtml

参考3:

http://blog.csdn.net/lovediji/article/details/6880751

原创粉丝点击