最近在研究android 版本的win8效果,只牵强实现了一部分。
1.自定义一个view,做为要移动和展示用。
package com.shao.test;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;

public class MyView2 extends View{


private int alpha = 250;
private boolean pressed = false;
static final int NONE = 0;
static final int DRAG = 1; //拖动中
static final int ZOOM = 2; //缩放中
static final int BIGGER = 3; //放大ing
static final int SMALLER = 4; //缩小ing
private int mode = NONE; //当前的事件

private float beforeLenght; //两触点距离
private float afterLenght; //两触点距离
private float scale = 0.04f; //缩放的比例 X Y方向都是这个值 越大缩放的越快

private int screenW;
private int screenH;

/*处理拖动 变量 */
private int start_x;
private int start_y;
private int stop_x ;
private int stop_y ;


private int res_id;

private TranslateAnimation trans; //处理超出边界的动画


private int mX;
private int mY;
private int mWidth;
private int mHeight;

private static int mStartX;
private static int mStartY;
private static int mEndX;
private static int mEndY;

private static int isTouchID=-1;


public MyView2(Context context) {
super(context);
}

public MyView2(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}

public MyView2(Context context,int w,int h,int res)
{
super(context);
this.setPadding(0, 0, 0, 0);
screenW = w;
screenH = h;
res_id = res;


}
public MyView2(Context context,int w,int h)
{
super(context);
this.setPadding(0, 0, 0, 0);
screenW = w;
screenH = h;

}


Matrix m;
public void show()
{
new Thread(){
public void run() {
int time = 2000;
try
{
pressed = true;
while(time>0)
{
Thread.sleep(200);
time -= 200;
alpha-= 25;

postInvalidate();
}
pressed = false;
}
catch (Exception e)
{
e.printStackTrace();
}
};
}.start();
}



/**
* 就算两点间的距离
*/
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}

@Override
public boolean onTouchEvent(MotionEvent event)
{

switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
show();
isTouchID = 1;
mode = DRAG;
stop_x = (int) event.getRawX();

stop_y = (int) event.getRawY();
start_x = (int) event.getX();
start_y = stop_y - this.getTop();

mEndX = stop_x;
mEndY = stop_y;
mStartX = start_x;
mStartY = start_y;
if(event.getPointerCount()==2)
beforeLenght = spacing(event);

break;
case MotionEvent.ACTION_POINTER_DOWN:
isTouchID = 1;
if (spacing(event) > 10f) {
mode = ZOOM;
beforeLenght = spacing(event);
}
break;
case MotionEvent.ACTION_UP:
isTouchID = 2;
/*判断是否超出范围 并处理*/
int disX = 0;
int disY = 0;
if(getHeight()<=screenH || this.getTop()<0)
{
if(this.getTop()<0 )
{
int dis = getTop();
this.layout(this.getLeft(), 0, this.getRight(), 0 + this.getHeight());
disY = dis - getTop();
}
else if(this.getBottom()>screenH)
{
disY = getHeight()- screenH+getTop();
this.layout(this.getLeft(), screenH-getHeight(), this.getRight(), screenH);
}
}
if(getWidth()<=screenW)
{
if(this.getLeft()<0)
{
disX = getLeft();
this.layout(0, this.getTop(), 0+getWidth(), this.getBottom());
}
else if(this.getRight()>screenW)
{
disX = getWidth()-screenW+getLeft();
this.layout(screenW-getWidth(), this.getTop(), screenW, this.getBottom());
}
}
if(disX!=0 || disY!=0)
{
trans = new TranslateAnimation(disX, 0, disY, 0);
trans.setDuration(500);
this.startAnimation(trans);
}
mode = NONE;
break;
case MotionEvent.ACTION_POINTER_UP:

mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
isTouchID = 3;
/*处理拖动*/
if (mode == DRAG) {
if(Math.abs(stop_x-start_x-getLeft())<88 && Math.abs(stop_y - start_y-getTop())<85)
{
this.setPosition(stop_x - start_x, stop_y - start_y, stop_x + this.getWidth() - start_x, stop_y - start_y + this.getHeight());
stop_x = (int) event.getRawX();
stop_y = (int) event.getRawY();
}
}
/*处理缩放*/
else if (mode == ZOOM) {
if(spacing(event)>10f)
{
afterLenght = spacing(event);
float gapLenght = afterLenght - beforeLenght;
if(gapLenght == 0) {
break;
}
else if(Math.abs(gapLenght)>5f)
{
if(gapLenght>0) {
this.setScale(scale,BIGGER);
}else {
this.setScale(scale,SMALLER);
}
beforeLenght = afterLenght;
}
}
}
break;
}
return true;

/*
if(event.getAction() == MotionEvent.ACTION_DOWN)
show();

return false;*/
}




@Override
protected void onDraw(Canvas canvas)
{
Paint p = new Paint();
p.setColor(Color.WHITE);
p.setStyle(Paint.Style.STROKE);
p.setStrokeWidth(10);
BitmapDrawable bd=(BitmapDrawable) getBackground();

//BitmapDrawable bd=null ;//= (BitmapDrawable)getResources();
//BitmapDrawable bd = (BitmapDrawable) getDrawable();
if(bd!=null)
{
canvas.drawBitmap(imageScale(bd.getBitmap(), 107, 113), 21,18, p);

}
canvas.drawBitmap(BitmapFactory.decodeResource(getContext().getResources(), res_id), 0, 0, p);
if(isPressed())
{
canvas.drawRect(5,5,140,140,p);
}
/*
if(pressed)
{
p.setAlpha(alpha);
canvas.drawRect(5,5,140,140,p);
}*/
}

public static Bitmap imageScale(Bitmap bitmap, int dst_w, int dst_h){
int src_w = bitmap.getWidth();
int src_h = bitmap.getHeight();
float scale_w = ((float)dst_w)/src_w;
float scale_h = ((float)dst_h)/src_h;
Matrix matrix = new Matrix();
matrix.postScale(scale_w, scale_h);
Bitmap dstbmp = Bitmap.createBitmap(bitmap, 0, 0, src_w, src_h, matrix, true);
return dstbmp;
}


/**
* 实现处理缩放
*/
private void setScale(float temp,int flag) {
/*
if(flag==BIGGER) {
this.setFrame(this.getLeft()-(int)(temp*this.getWidth()),
this.getTop()-(int)(temp*this.getHeight()),
this.getRight()+(int)(temp*this.getWidth()),
this.getBottom()+(int)(temp*this.getHeight()));
}else if(flag==SMALLER){
this.setFrame(this.getLeft()+(int)(temp*this.getWidth()),
this.getTop()+(int)(temp*this.getHeight()),
this.getRight()-(int)(temp*this.getWidth()),
this.getBottom()-(int)(temp*this.getHeight()));
} */
}




/**
* 实现处理拖动
*/


public void setPosition(int left,int top,int right,int bottom) {

postInvalidate();

this.layout(left,top,right,bottom);
invalidate();
}



protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
// TODO Auto-generated method stub
Log.i("shao1","onlayout -left"+left+" top="+top+" right="+right+" bottom="+bottom);
mX=left;
mY=top;
mWidth=right;
mHeight=bottom;
super.onLayout(changed, left, top, right, bottom);
}


public static int getDirection(){
int x = mEndX -mStartX;//
int y = mEndY -mStartY;//
//限制必须得划过屏幕的1/3才能算划过
// float x_limit = screen.widthPixels / 3;
// float y_limit = screen.heightPixels / 3;
int x_limit = 20;
int y_limit = 20;
int x_abs = Math.abs(x);
int y_abs = Math.abs(y);
if(x_abs >= y_abs){
//gesture left or right
if(x > x_limit || x < -x_limit){
if(x>0){
//right
Log.i("shao","right-----------");
return 0;
// show("right");
}else if(x<0){
//left
Log.i("shao","left-----------");
return 1;
}
}
}else{
//gesture down or up
if(y> y_limit || y < -y_limit){
if(y>0){
//down
Log.i("shao","down-----------");
return 2;

}else if(y<0){
//up
Log.i("shao","up-----------");
return 3;
}
}
}
return 0;
}


public int[] getChangePosition(){
int retValue[]={mX,mY,mWidth,mHeight};
return retValue;
}

public int touchId(){
//Log.i("shao"," istouch ="+isTouchID);
return isTouchID;
}

public int[][] getLocation(int index) {
int [][] result =null;
for(int i=0;i<position.length;i++){
if(i==index){
for(int j=0;j<4;j++){
result[0][j]=position[index][j];
}
break;
}

}
return result;
}

public void setLocation(int index, int[] newposition) {

for(int i=0;i<position.length;i++){
if(i==index){
for(int j=0;j<4;j++){
position[index][j]=newposition[j];
}
break;
}
}
}

public int[][] position =
{
{
0,0,200,400
},
{
200, 0, 800, 200
},
{
200, 200, 800, 400
}
};

}




待续.....

更多相关文章

  1. Android(安卓)Display System
  2. android 编译过程及错误处理
  3. android 从matrix获取处理过的图片的实际宽度
  4. android AIDL(Android(安卓)Interface Define Language)
  5. Android图像处理_浮雕效果
  6. Android处理Bitmap的一些方法
  7. 解析Android消息处理机制:Handler/Thread/Looper & MessageQueue
  8. android 已省内存方式把图片加载到内存
  9. 代码:android崩溃日志收集和处理

随机推荐

  1. Android(安卓)项目贪吃蛇最初版本实现。
  2. Android 进阶——Android Studio 项目结
  3. PC安卓模拟器PANIC: Could not open:C:\
  4. Android Application 创建全局变量
  5. KVM is required to run this AVD. /dev/
  6. Android群英传神兵利器读书笔记——第三
  7. eclipse 安装adt
  8. Android 使用 GreenDAO 3.x 进行增删改查
  9. 像素和dip之间的相互转换
  10. Android(安卓)怎么退出整个应用程序