zoukankan      html  css  js  c++  java
  • 安卓 surfaceview 添加点击事件

    功能说明:在一个Activity页面中,点击页面布局中的MapView(继承SurfaceView),实现页面中的某个元素隐藏和显示。

    贴出MapView的代码:

      1 /**
      2  * @author gr
      3  */
      4 package com.cn.gordon.exhibition.walk.view;
      5 
      6 import android.content.Context;
      7 import android.graphics.Bitmap;
      8 import android.graphics.Canvas;
      9 import android.graphics.Color;
     10 import android.graphics.Matrix;
     11 import android.graphics.Paint;
     12 import android.graphics.PorterDuff.Mode;
     13 import android.util.AttributeSet;
     14 import android.util.Log;
     15 import android.view.GestureDetector;
     16 import android.view.GestureDetector.SimpleOnGestureListener;
     17 import android.view.MotionEvent;
     18 import android.view.SurfaceHolder;
     19 import android.view.SurfaceHolder.Callback;
     20 import android.view.SurfaceView;
     21 import android.view.View;
     22 
     23 /**
     24  * @author gr
     25  * 
     26  */
     27 public class MapView extends SurfaceView implements Callback {
     28 
     29     private Context context;
     30     private Bitmap bitmap_map;
     31     private Paint bitmap_paint;
     32     private float move_x, move_y;
     33     private int view_W, view_H;
     34     private float offset = 1, offset_back = 1,myPosition_degree = 0;
     35     private GestureDetector mGestureDetector;
     36     private MyPosition myPosition;
     37 
     38     public MapView(Context context, AttributeSet attrs, int defStyle) {
     39         super(context, attrs, defStyle);
     40         init(context);
     41     }
     42 
     43     public MapView(Context context, AttributeSet attrs) {
     44         super(context, attrs);
     45         init(context);
     46     }
     47 
     48     public MapView(Context context) {
     49         super(context);
     50         init(context);
     51         setFocusable(true);//使用Key event,setFocusable(true)可以聚焦
     52     }
     53 
     54     private void init(Context context) {
     55         this.context = context;
     56         bitmap_paint = new Paint();
     57         bitmap_paint.setAntiAlias(true);
     58         myPosition = new MyPosition(this.context);
     59         mGestureDetector = new GestureDetector(this.context,
     60                 new MyOnGestureListener());
     61         getHolder().addCallback(this);
     62         setOnClickListener(new OnClickListener() {
     63             
     64             @Override
     65             public void onClick(View v) {
     66                 // TODO Auto-generated method stub
     67                 if (v!=null) {
     68                     
     69                 }
     70             }
     71         });
     72         setOnTouchListener(new OnTouchListener() {
     73 
     74             @Override
     75             public boolean onTouch(View v, MotionEvent event) {
     76                 if (event.getPointerCount() > 1) {
     77                     return false;
     78                 }
     79                 mGestureDetector.onTouchEvent(event);
     80                 return true;
     81             }
     82         });
     83     }
     84 
     85     public void setMap(Bitmap bitmap) {
     86         bitmap_map = bitmap;
     87         move_x = 0;
     88         move_y = 0;
     89         if (view_W != 0) {
     90             offset_back = offset = (float) view_W
     91                     / (float) bitmap_map.getWidth();
     92         }
     93 
     94         draw();
     95 
     96     }
     97 
     98     public synchronized void doDraw(Canvas canvas) {
     99         canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
    100         if (bitmap_map == null) {
    101             return;
    102         }
    103 
    104         Matrix matrix = new Matrix();
    105         matrix.postScale(offset, offset);
    106         matrix.postTranslate(move_x, move_y);
    107         canvas.drawBitmap(bitmap_map, matrix, bitmap_paint);
    108         myPosition.draw(canvas, (100*offset+move_x), (100*offset+move_y), myPosition_degree);
    109     }
    110 
    111     @Override
    112     public void surfaceChanged(SurfaceHolder holder, int format, int width,
    113             int height) {
    114         // TODO Auto-generated method stub
    115 
    116     }
    117 
    118     @Override
    119     public void surfaceCreated(SurfaceHolder holder) {
    120         view_W = getWidth();
    121         view_H = getHeight();
    122         if (bitmap_map != null) {
    123             offset_back = offset = (float) view_W
    124                     / (float) bitmap_map.getWidth();
    125         }
    126         draw();
    127 
    128     }
    129 
    130     @Override
    131     public void surfaceDestroyed(SurfaceHolder holder) {
    132         // TODO Auto-generated method stub
    133 
    134     }
    135 
    136     private void draw() {
    137         Canvas canvas = getHolder().lockCanvas(null);
    138         if (canvas != null) {
    139             doDraw(canvas);
    140         }
    141         if (canvas != null) {
    142             getHolder().unlockCanvasAndPost(canvas);
    143         }
    144     }
    145 
    146     private class MyOnGestureListener extends SimpleOnGestureListener {
    147 
    148         @Override
    149         public boolean onSingleTapUp(MotionEvent e) {
    150             Log.i(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>", "mapview onSingleTapUp click");
    151             return true;
    152         }
    153 
    154         @Override
    155         public boolean onScroll(MotionEvent e1, MotionEvent e2,
    156                 float distanceX, float distanceY) {
    157             move_x = move_x - distanceX;
    158             move_y = move_y - distanceY;
    159             if (move_x > 0) {
    160                 move_x = 0;
    161             }
    162 
    163             if (move_x < (view_W - bitmap_map.getWidth() * offset)) {
    164                 move_x = view_W - bitmap_map.getWidth() * offset;
    165                 if (move_x > 0) {
    166                     move_x = 0;
    167                 }
    168             }
    169             if (move_y > 0) {
    170                 move_y = 0;
    171             }
    172             if (move_y < (view_H - bitmap_map.getHeight() * offset)) {
    173                 move_y = view_H - bitmap_map.getHeight() * offset;
    174                 if (move_y > 0) {
    175                     move_y = 0;
    176                 }
    177             }
    178             Log.i(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>", "mapview onScroll click");
    179             draw();
    180             return true;
    181         }
    182 
    183         @Override
    184         public boolean onDown(MotionEvent e) {
    185             temp_x = 0;
    186             temp_y = 0;
    187             Log.i(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>", "mapview onDown click");
    188             return true;
    189         }
    190 
    191         @Override
    192         public boolean onDoubleTapEvent(MotionEvent e) {
    193 
    194             offset = offset_back;
    195             move_x = 0;
    196             move_y = 0;
    197             Log.i(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>", "mapview onDoubleTapEvent click");
    198             draw();
    199             return true;
    200         }
    201 
    202         @Override
    203         public boolean onSingleTapConfirmed(MotionEvent e) {
    204             Log.i(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>", "mapview onSingleTapConfirmed click");
    205             if(clickLinster != null){
    206                 clickLinster.onClick();
    207             }
    208             return true;
    209         }
    210 
    211     }
    212     private float temp_x,temp_y;
    213     @Override
    214     public boolean onTouchEvent(MotionEvent event) {
    215         if(temp_x != 0 && temp_y != 0){
    216             float xx = Math.abs(event.getX(0) - event.getX(1))
    217                     - Math.abs(temp_x);
    218             float yy = Math.abs(event.getY(0) - event.getY(1))
    219                     - Math.abs(temp_y);
    220             float t = 0;
    221             t = Math.abs(xx) > Math.abs(yy)?xx:yy;
    222             if(t != 0){
    223                 if(t > 0){
    224                     offset += Math.abs(t) / 500;
    225                 } else {
    226                     offset -= Math.abs(t) / 500;
    227                 }
    228                 if(bitmap_map.getWidth()*offset > view_W/2 || bitmap_map.getHeight()*offset > view_H/2){
    229                     
    230                     draw();
    231                 }
    232             }
    233         }
    234         temp_x = event.getX(0) - event.getX(1);
    235         temp_y = event.getY(0) - event.getY(1);
    236         return super.onTouchEvent(event);
    237     }
    238     
    239     public void setDegree(float degree){
    240         myPosition_degree = degree;
    241         draw();
    242     }
    243 
    244 
    245     private OnMyClickLinster clickLinster;
    246     
    247     
    248     
    249     public void setClickLinster(OnMyClickLinster clickLinster) {
    250         this.clickLinster = clickLinster;
    251     }
    252 
    253     public interface OnMyClickLinster{
    254         public void onClick();
    255     }
    256 }

    代码中红色标记为关键代码,主要目的是向外提供一个该MapView可供用户点击的公共接口。

    然后贴出测试代码:

     1 package com.cn.gordon.exhibition.walk.activity;
     2 
     3 import com.cn.gordon.exhibition.walk.view.MapView;
     4 
     5 import android.app.Activity;
     6 import android.graphics.BitmapFactory;
     7 import android.os.Bundle;
     8 import android.widget.Toast;
     9 
    10 public class ForumArrangementActivity extends Activity {
    11     /** Called when the activity is first created. */
    12     private MapView wallpaper;
    13     //LinearLayout linearLayout;
    14     @Override
    15     public void onCreate(Bundle savedInstanceState) {
    16         super.onCreate(savedInstanceState);
    17         setContentView(R.layout.mymap);
    18         super.onCreate(savedInstanceState);
    19         wallpaper = (MapView)super.findViewById(R.id.mymap); 
    20         wallpaper.setMap(BitmapFactory.decodeResource(getResources(), R.drawable.map));
    21         wallpaper.setFocusable(true);
    22         wallpaper.setFocusableInTouchMode(true);
    23         wallpaper.setClickLinster(new MapView.OnMyClickLinster() {
    24             
    25             @Override
    26             public void onClick() {
    27                 Toast.makeText(ForumArrangementActivity.this, "haha ", Toast.LENGTH_SHORT).show();
    28             }
    29         });
    30     }
    31 }

    当然,还有mymap的布局文件。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFFFFFFF" >
    
            <RelativeLayout
                android:id="@+id/temp_relative"
                android:layout_width="match_parent"
                android:layout_height="50dip"
                android:layout_alignParentTop="true"
                android:background="#FF333333" >
                  
               <Button 
                   android:id="@+id/title_information"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_centerInParent="true"
                   android:background="#00FFFFFF"
                   android:text="@string/walk_exhibition"
                   android:textColor="#FFFFFFFF"
                   android:textSize="20sp"/>
            <TextView
                android:id="@+id/titlebar_information"
                android:layout_width="18dip"
                android:layout_height="18dip"
                android:layout_toRightOf="@id/title_information"
                android:background="@drawable/title_notifybar"
                android:layout_marginTop="5dip"
                android:text="@string/information_count"
                android:textColor="#FFFFFFFF"
                android:textSize="12sp" 
                android:gravity="center"/>
    
                <Button
                    android:layout_width="80dip"
                    android:layout_height="50dip"
                    android:id="@+id/btn_menu"
                    android:background="@drawable/menu_btn_bg"
                     />
                <Button
                    android:layout_width="30dip"
                    android:layout_height="30dip"
                    android:id="@+id/btn_submenu_information"
                    android:layout_centerVertical="true"
                    android:layout_alignParentRight="true"
                    android:layout_marginRight="20dip"
                    android:background="@drawable/querybtn_pressed_bg" />
            </RelativeLayout>
            
            
            
            <LinearLayout 
                android:layout_width="match_parent"
                android:layout_height="50dip"
                android:orientation="vertical"
                android:id="@+id/temp_linearlayout"
                android:layout_alignParentBottom="true"
                android:background="#FF5c5c5c">
                <LinearLayout 
                    android:layout_width="match_parent"
                    android:layout_height="25dip"
                    android:orientation="horizontal"
                    android:baselineAligned="false" 
                    android:id="@+id/map_layout1">
                    <LinearLayout 
                        android:layout_width="0dip"
                        android:layout_height="25dip"
                        android:gravity="center_vertical"
                        android:layout_weight="1">
                        <TextView 
                            android:layout_width="10dip"
                            android:layout_height="10dip"
                            android:layout_marginLeft="10dip"
                            android:background="@drawable/walk_pointer"
                            />
                        <TextView 
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dip"
                            android:text="@string/walk_whereiam"
                            android:textSize="12sp"
                            android:textColor="@color/blue"/>
                    </LinearLayout>
                    <LinearLayout 
                        android:layout_width="0dip"
                        android:layout_height="30dip"
                        android:gravity="center_vertical"
                        android:layout_weight="1">
                            <TextView 
                            android:layout_width="10dip"
                            android:layout_height="10dip"
                            android:layout_marginLeft="10dip"
                            android:background="@drawable/walk_havewalked"
                            />
                        <TextView 
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dip"
                            android:text="@string/walk_havewalked"
                            android:textSize="12sp"
                            android:textColor="@color/blue"/>
                    </LinearLayout>
                    <LinearLayout 
                        android:layout_width="0dip"
                        android:layout_height="30dip"
                        android:gravity="center_vertical"
                        android:layout_weight="1">
                            <TextView 
                            android:layout_width="10dip"
                            android:layout_height="10dip"
                            android:layout_marginLeft="10dip"
                            android:background="@drawable/walk_togo"
                            />
                        <TextView 
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dip"
                            android:text="@string/walk_togo"
                            android:textSize="12sp"
                            android:textColor="@color/blue"/>
                    </LinearLayout>
                    <LinearLayout 
                        android:layout_width="0dip"
                        android:layout_height="30dip"
                        android:gravity="center_vertical"
                        android:layout_weight="1">
                            <TextView 
                            android:layout_width="10dip"
                            android:layout_height="10dip"
                            android:layout_marginLeft="10dip"
                            android:background="@drawable/title_notifybar"
                            />
                        <TextView 
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dip"
                            android:text="@string/walk_information"
                            android:textSize="12sp"
                            android:textColor="@color/blue"/>
                    </LinearLayout>
                </LinearLayout>
                <LinearLayout 
                    android:layout_width="match_parent"
                    android:layout_height="25dip"
                    android:baselineAligned="false"
                    android:orientation="horizontal"
                    android:gravity="center_vertical"
                    android:id="@+id/map_layout2">
                        <LinearLayout 
                        android:layout_width="0dip"
                        android:layout_height="25dip"
                        android:gravity="center_vertical"
                        android:layout_weight="1">
                        <TextView 
                            android:layout_width="10dip"
                            android:layout_height="10dip"
                            android:layout_marginLeft="10dip"
                            android:background="@drawable/btn_queryresult"
                            />
                        <TextView 
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dip"
                            android:text="@string/walk_query"
                            android:textSize="12sp"
                            android:textColor="@color/blue"/>
                    </LinearLayout>
                    <LinearLayout 
                        android:layout_width="0dip"
                        android:layout_height="30dip"
                        android:gravity="center_vertical"
                        android:layout_weight="1">
                            <TextView 
                            android:layout_width="10dip"
                            android:layout_height="10dip"
                            android:layout_marginLeft="10dip"
                            android:background="@drawable/walk_lots"
                            />
                        <TextView 
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dip"
                            android:text="@string/walk_lots"
                            android:textSize="12sp"
                            android:textColor="@color/blue"/>
                    </LinearLayout>
                    <LinearLayout 
                        android:layout_width="0dip"
                        android:layout_height="30dip"
                        android:gravity="center_vertical"
                        android:layout_weight="1">
                            <TextView 
                            android:layout_width="10dip"
                            android:layout_height="10dip"
                            android:layout_marginLeft="10dip"
                            android:background="@drawable/walk_many"
                            />
                        <TextView 
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dip"
                            android:text="@string/walk_many"
                            android:textSize="12sp"
                            android:textColor="@color/blue"/>
                    </LinearLayout>
                    <LinearLayout 
                        android:layout_width="0dip"
                        android:layout_height="30dip"
                        android:gravity="center_vertical"
                        android:layout_weight="1">
                            <TextView 
                            android:layout_width="10dip"
                            android:layout_height="10dip"
                            android:layout_marginLeft="10dip"
                            android:background="@drawable/walk_little"
                            />
                        <TextView 
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="5dip"
                            android:text="@string/walk_little"
                            android:textSize="12sp"
                            android:textColor="@color/blue"/>
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
            <com.cn.gordon.exhibition.walk.view.MapView
                android:id="@+id/mymap"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_centerInParent="true"
                android:layout_below="@+id/temp_relative"
                android:layout_above="@+id/temp_linearlayout"
                android:orientation="vertical"
                android:visibility="visible" >
    
            </com.cn.gordon.exhibition.walk.view.MapView>
    </RelativeLayout>

    surfaceview的点击事件可以实现了,在这里的代码是测试代码。

  • 相关阅读:
    在Windows Server 2008 R2下搭建jsp环境(四)-在测试的过程中可能出现的问题
    在Windows Server 2008 R2下搭建jsp环境(一)-JDK的下载安装
    在Windows Server 2008 R2下搭建jsp环境(二)-mysql的下载安装
    如何去掉word中的回车符??
    打开office时提示错误窗口“向程序发送命令时出现问题”的解决方案
    在Windows Server 2008 R2下搭建jsp环境
    咱们一起来搭建一个FTP服务器
    如何将项目部署到Github
    电脑开机失败提示"用户配置文件服务登录失败"的三种解决办法
    个人作业2
  • 原文地址:https://www.cnblogs.com/SeawinLong/p/4021931.html
Copyright © 2011-2022 走看看