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
- android实现按钮拖动效果及路径的绘制等2D绘图功能---待完善
- Android下图片或按钮等可拖动到任意位置的效果实现源码
- servlet实现的一个购物车展示功能,待完善(添加,删除购物车等操作)
- QT5之2D绘图-绘制路径
- 基于Struts2和Android的简单登陆注册功能的设计与实现(待完善)
- Android统计图形绘制及点击事等功能的实现-achartengine篇
- 使用QT 2D绘图实现窗体的阴影效果
- c#实现按钮拖动效果
- js实现canvas绘制的图形的拖动效果
- android 实现可以拖动的按钮
- VC实现按钮的3D效果
- android实现拖动效果
- android 实现拖动效果
- Android实现拖动效果
- Android拖动效果实现
- 如何实现android控件的拖动效果
- android UI——2D绘图绘制几何图形
- OSG绘制的部分流程(待修改完善)????????????
- __attribute__机制介绍
- ViewGroup onInterceptTouchEvent,ViewGroup onTouchEvent,View onTouchEvent执行顺序说明
- 数据泵执行导入导出
- UVa 414 - Machined Surfaces
- sigaction函数解析
- android实现按钮拖动效果及路径的绘制等2D绘图功能---待完善
- 个人赛Practice(1)解题报告
- OCP-1Z0-053-V12.02-22题
- int*p[ ]与int(*p)[ ]的不同
- C语言经典排序算法大全
- android textView设置html,解决图片和文字不对齐的问题
- 大量实用工具类、开源包,该帖绝对值得你收藏
- libgit2:纯C语言实现的Git开发包
- 这问题怎么解决???