Android技术——高级UI:视图拖拽(下)

三、用视图拖拽+GridLayout实现简单移图游戏

这只实现了简单的最核心的UI,没有写判赢逻辑。

1、/YituGame/res/layout/activity_game_main_line.xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center"

android:id="@+id/rel_root"

android:padding="5dp" >

<GridLayout

android:id="@+id/grl_root"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:columnCount="2"

android:rowCount="5" >

<ImageView

android:id="@+id/imageView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_columnSpan="2"

android:background="@drawable/final_img" />

<Space

android:layout_height="20dp"

android:layout_columnSpan="2" />

<LinearLayout

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_columnSpan="2"

android:orientation="horizontal" >

<LinearLayout

android:id="@+id/lil_0_0"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

android:orientation="horizontal" >

<ImageView

android:id="@+id/img_0_0"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="@drawable/img_1" />

</LinearLayout>

<LinearLayout

android:id="@+id/lil_0_1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

android:orientation="horizontal" >

</LinearLayout>

</LinearLayout>

<LinearLayout

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_columnSpan="2"

android:orientation="horizontal" >

<LinearLayout

android:id="@+id/lil_1_0"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

android:orientation="horizontal" >

<ImageView

android:id="@+id/img_1_0"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/img_2" />

</LinearLayout>

<LinearLayout

android:id="@+id/lil_1_1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

android:orientation="horizontal" >

<ImageView

android:id="@+id/img_1_1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/img_4" />

</LinearLayout>

</LinearLayout>

<LinearLayout

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_columnSpan="2"

android:orientation="horizontal" >

<LinearLayout

android:id="@+id/lil_2_0"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

android:orientation="horizontal" >

<ImageView

android:id="@+id/img_2_0"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/img_5" />

</LinearLayout>

<LinearLayout

android:id="@+id/lil_2_1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="1"

android:orientation="horizontal" >

<ImageView

android:id="@+id/img_2_1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/img_3" />

</LinearLayout>

</LinearLayout>

</GridLayout>

</RelativeLayout>

2、/YituGame/src/com/thinking/yitugame/Game_Main.java文件

package com.thinking.yitugame;

import com.thinking.basicService.LogService;

import android.app.Activity;

import android.content.ClipData;

import android.os.Bundle;

import android.view.DragEvent;

import android.view.MotionEvent;

import android.view.View;

import android.view.Window;

import android.view.View.DragShadowBuilder;

import android.view.View.OnDragListener;

import android.view.View.OnTouchListener;

import android.view.ViewGroup;

import android.view.WindowManager;

import android.widget.GridLayout;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.RelativeLayout;

public class Game_Main extends Activity

{

LinearLayout   lil_0_0;

LinearLayout   lil_0_1;

LinearLayout   lil_1_0;

LinearLayout   lil_1_1;

LinearLayout   lil_2_0;

LinearLayout   lil_2_1;

RelativeLayout rel_root;

@Override

protected void onCreate(Bundle savedInstanceState)

{

LogService.writeLog("running!");

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.activity_game_main_line);

ImageView img_0_0 = (ImageView) findViewById(R.id.img_0_0);

ImageView img_1_0 = (ImageView) findViewById(R.id.img_1_0);

ImageView img_1_1 = (ImageView) findViewById(R.id.img_1_1);

ImageView img_2_0 = (ImageView) findViewById(R.id.img_2_0);

ImageView img_2_1 = (ImageView) findViewById(R.id.img_2_1);

lil_0_0 = (LinearLayout) findViewById(R.id.lil_0_0);

lil_0_1 = (LinearLayout) findViewById(R.id.lil_0_1);

lil_1_0 = (LinearLayout) findViewById(R.id.lil_1_0);

lil_1_1 = (LinearLayout) findViewById(R.id.lil_1_1);

lil_2_0 = (LinearLayout) findViewById(R.id.lil_2_0);

lil_2_1 = (LinearLayout) findViewById(R.id.lil_2_1);

rel_root = (RelativeLayout) findViewById(R.id.rel_root);

img_0_0.setOnTouchListener(new ImgOnTouchListener());

img_1_0.setOnTouchListener(new ImgOnTouchListener());

img_1_1.setOnTouchListener(new ImgOnTouchListener());

img_2_0.setOnTouchListener(new ImgOnTouchListener());

img_2_1.setOnTouchListener(new ImgOnTouchListener());

lil_0_0.setOnDragListener(new MyDragListener());

lil_0_1.setOnDragListener(new MyDragListener());

lil_1_0.setOnDragListener(new MyDragListener());

lil_1_1.setOnDragListener(new MyDragListener());

lil_2_0.setOnDragListener(new MyDragListener());

lil_2_1.setOnDragListener(new MyDragListener());

rel_root.setOnDragListener(new MyDragListener());

}

private int[] getXYById(int id)

{

if (id == lil_0_0.getId())

{

return new int[] { 0, 0 };

}

if (id == lil_0_1.getId())

{

return new int[] { 0, 1 };

}

if (id == lil_1_0.getId())

{

return new int[] { 1, 0 };

}

if (id == lil_1_1.getId())

{

return new int[] { 1, 1 };

}

if (id == lil_2_0.getId())

{

return new int[] { 2, 0 };

}

if (id == lil_2_1.getId())

{

return new int[] { 2, 1 };

} else

{

return new int[] { -1, -1 };

}

}

private class ImgOnTouchListener implements OnTouchListener

{

@Override

public boolean onTouch(View v, MotionEvent event)

{

LogService.writeLog("onTouch running!");

ClipData data = ClipData.newPlainText("", "");

DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);

v.startDrag(data, shadowBuilder, v, 0);

return true;

}

}

class MyDragListener implements OnDragListener

{

@Override

public boolean onDrag(View v, DragEvent event)

{

int action = event.getAction();

switch (event.getAction())

{

case DragEvent.ACTION_DRAG_STARTED:

break;

case DragEvent.ACTION_DRAG_ENTERED:

break;

case DragEvent.ACTION_DRAG_EXITED:

break;

case DragEvent.ACTION_DROP:

View view = (View) event.getLocalState();

ViewGroup owner = (ViewGroup) view.getParent();

LinearLayout container;

try

{

container = (LinearLayout) v;

} catch (Exception e)

{

view.setVisibility(View.VISIBLE);

break;

}

LogService.writeLog("owner:" + getXYById(owner.getId())[0]

+ " " + getXYById(owner.getId())[1] + " container:"

+ getXYById(container.getId())[0] + " "

+ getXYById(container.getId())[1]);

LogService.writeLog("getChildCount"

+ container.getChildCount());

if ((getXYById(owner.getId())[0] == getXYById(container

.getId())[0] || getXYById(owner.getId())[1] == getXYById(container

.getId())[1])

&& container.getChildCount() == 0)

{

owner.removeView(view);

container.addView(view);

}

view.setVisibility(View.VISIBLE);

break;

case DragEvent.ACTION_DRAG_ENDED:

default:

break;

}

return true;

}

}

}

真机运行效果:

时间: 2024-10-11 22:47:08

Android技术——高级UI:视图拖拽(下)的相关文章

Android 贝塞尔曲线实现QQ拖拽清除效果

纯属好奇心驱动写的一个学习性Demo,效果如下: 这个小功能最重要的点在于起始点和触摸点之间的连接线绘制,它并不是一条单纯的直线,而是中间细两头粗的一条不规则的Path,而这个中间向内弯曲的效果正是一条贝塞尔曲线,中间这个Path是由两条贝塞尔曲线和两条直线组成.看下图: 两个带圆弧的线就是由三点确认的一个贝塞尔曲线: 在Android已经有提供画贝塞尔曲线的接口,三个点传进去,效果就出来了. 贝塞尔曲线是用三个或多个点来确定的一条曲线,它在图形图像学中有相当重要的地位,Path中也提供了一些方

JQuery UI的拖拽功能

JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量的第三方插件可以丰富JQuery UI的功能. JQuery UI提供的API极大简化了拖拽功能的开发.只需要分别在拖拽源(source)和目标(target)上调用draggable和droppable两个函数即可. 拖拽原理 首先要明确几个概念. ource:拖拽源,要拖动的元素. taerge

Android基础——高级UI组件:下拉框,列表,滚动条视图

布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.andr

Android基础——高级UI组件:图像视图和图片切换器

layout代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.

Android多点触控缩放拖拽实例

在Android上查看图片或者浏览网页时,我们往往有把图片或者网页放大或者缩小的的需求,这样就能够获得更多的细节信息 或者获得更多的全貌信息,多点触摸与绽放功能正是满足这种应用场景的技术. 下面通过一个例子来学习实现图片的拖拉功能: 程序运行示意图:1.初始化界面  2.为缩小的界面  3.为放大的界面            新建一个名称为DragAndDrop的Android工程,目录结构如下: 主界面的activity_layout.xml的布局代码如下: <RelativeLayout x

Android基础——高级UI组件:选项卡

布局文件 <?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.c

如何将 ui 上拖拽上去的控件定义成我们自己的类

在MFC的开发过程中,我们经常会有这样的操作: 1.在对话框设计界面上放置一个控件,如按钮.标签.编辑框等等 2.右键选中这个控件,生成一个控件变量 3.此时查看这个控件变量的类型,是MFC的基本类型,如CButton.CStatic.CEdit等等 4.如果我们需要对控件做些个性化的改变,我们可以派生一个类,基类可以是CButton.CStatic.CEdit等等 5.此时我们只需要在头文件里将生成的控件变量改成我们派生的这个类即可,将界面上的控件改变成我们自己的类 而在Qt中,要想实现类似的

Android DragAndDrop API 拖拽效果 交换ListView的Item值

前言 Android系统自API Level11开始添加了关于控件拖拽的相关API,可以方便的实现控件的一些拖拽效果,而且比自己用Touch事件写的效果更好.下面就来看下DragAndDrop吧. 使用Android的DragAndDrop框架,我们可以方便的在当前布局中用拖拽的形式实现两个View之间数据的互换.DragAndDrop框架包括一个拖拽事件的类,拖拽监听器,以及一些帮助方法和类. 尽管DragAndDrop主要是为了数据移动而设计,但是我们也可用他做别的UI处理.举个例子,我们可

jQuery UI API - 可拖拽小部件(Draggable Widget)(转)

所属类别 交互(Interactions) 用法 描述:允许使用鼠标移动元素. 版本新增:1.0 依赖: UI 核心(UI Core) 部件库(Widget Factory) 鼠标交互(Mouse Interaction) 注释:让被选元素可被鼠标拖拽.如果您不只是拖拽,而是拖拽 & 放置,请查看 jQuery UI 可放置(Droppable)插件,为可拖拽元素提供了一个放置目标. 快速导航 选项 方法 事件 addClasses appendTo axis cancel connectToS