博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义View在android2.3.3手机上正常运行 在android4.2.2手机上报空指针
阅读量:5329 次
发布时间:2019-06-14

本文共 7124 字,大约阅读时间需要 23 分钟。

============问题描述============

自定义view
public class PasterView extends View
{
private final static int MODE_NONE = 0;
private final static int MODE_DRAG = 1;
private final static int MODE_ZOOM = 2;
private int mode = MODE_NONE;
private Paint paint;
private Matrix matrix;
private Bitmap bitmap;
private float oldX;
private float oldY;
private float firstX;
private float firstY;
private float oldDistance;
private PointF midPoint;
private float oldAngle;
private Context context;
private AlertDialog dialog;
public PasterView(Context context)
{
super(context);
this.context = context;
paint = new Paint();
paint.setAntiAlias(true);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.menu_camera);
}
public PasterView(Context context, AttributeSet attrs)
{
super(context, attrs);
this.context = context;
paint = new Paint();
paint.setAntiAlias(true);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.menu_camera);
}
public PasterView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
this.context = context;
paint = new Paint();
paint.setAntiAlias(true);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.menu_camera);
}
@Override
protected void onDraw(Canvas canvas)
{
if(bitmap != null){
if(matrix == null){
matrix = new Matrix();
matrix.postTranslate((getWidth() - bitmap.getWidth())/2, (getHeight() - bitmap.getHeight())/2);
midPoint = new PointF(getWidth()/2, getHeight()/2);
}
canvas.drawBitmap(bitmap, matrix, paint);
}
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch(event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN:
mode = MODE_DRAG;
oldX = event.getX();
oldY = event.getY();
firstX = event.getX();
firstY = event.getY();
break;
case MotionEvent.ACTION_POINTER_DOWN:
mode = MODE_ZOOM;
oldDistance = getDistance(event);
// midPoint = getMidPoint(event);
oldAngle = getAngle(event);
break;
case MotionEvent.ACTION_MOVE:
if(mode == MODE_DRAG){
float x = event.getX();
float y = event.getY();
matrix.postTranslate(x - oldX, y - oldY);
midPoint.x += (x - oldX);
midPoint.y += (y - oldY);
invalidate();
oldX = x;
oldY = y;
}
else if(mode == MODE_ZOOM){
float fDistance = getDistance(event);
float scale = fDistance/oldDistance;
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
float angle = getAngle(event);
matrix.postRotate((float) ((oldAngle - angle)*180/3.1415926), midPoint.x, midPoint.y);
invalidate();
oldDistance = fDistance;
oldAngle = angle;
}
break;
case MotionEvent.ACTION_UP:
if(mode == MODE_DRAG){
if(Math.abs(firstX - event.getX()) < 0.1 && Math.abs(firstY - event.getY()) < 0.1){
if(dialog == null){
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("是否删除贴纸?");
builder.setNegativeButton(getResources().getString(R.string.cancel), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.cancel();
}
});
builder.setPositiveButton(getResources().getString(R.string.ok), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
reset();
setVisibility(View.GONE);
}
});
dialog = builder.create();
}
dialog.show();
}
}
mode = MODE_NONE;
break;
case MotionEvent.ACTION_POINTER_UP:
mode = MODE_NONE;
break;
}
return super.onTouchEvent(event);
}
public Matrix getMatrix()
{
return matrix;
}
public void setMatrix(Matrix matrix)
{
this.matrix = matrix;
}
public Bitmap getBitmap()
{
return bitmap;
}
public void setBitmap(Bitmap bitmap)
{
this.bitmap = bitmap;
}
private float getDistance(MotionEvent event){
return (float) Math.sqrt(Math.pow(event.getX(0) - event.getX(1), 2) + Math.pow(event.getY(0) - event.getY(1), 2));
}
private PointF getMidPoint(MotionEvent event){
return new PointF((event.getX(0) + event.getX(1))/2, (event.getY(0) + event.getY(1))/2);
}
private float getAngle(MotionEvent event){
return (float) Math.atan2(event.getY(1) - event.getY(0),event.getX(0) - event.getX(1));
}
public void reset(){
matrix = null;
mode = MODE_NONE;
}
public void release(){
if(bitmap != null && !bitmap.isRecycled()){
bitmap.recycle();
bitmap = null;
}
}
布局
<?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" >
    <RelativeLayout
        android:id="@+id/rlTop"
        android:layout_width="match_parent"
        android:layout_height="44dp"
        android:background="@color/xx_translucence_camera" >
        <ImageView
            android:id="@+id/ivCancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/xx_cancel_shot"
            android:padding="10dp"
            android:layout_marginLeft="10dp"
            android:layout_centerVertical="true" />
        <ImageView
            android:id="@+id/ivAddPaster"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:src="@drawable/xxx_add_paster"
            android:layout_marginRight="20dp"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:scaleType="center" />
    </RelativeLayout>
    <ImageView
        android:id="@+id/ivPhoto"
        android:layout_below="@id/rlTop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="fitXY" /> 
    <com.xx.xxx.xxxxx.PasterView
        android:id="@+id/pasterView"
        android:layout_below="@id/rlTop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:background="#00000000"
        android:visibility="gone"/>
    <RelativeLayout
        android:id="@+id/rlMid"
        android:layout_below="@id/ivPhoto"
        android:layout_above="@+id/rlBottom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/xx_translucence_camera" >
        <HorizontalScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="none"
            android:layout_alignParentBottom="true" >
            <LinearLayout
                android:id="@+id/llLens"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:focusable="true"
                android:focusableInTouchMode="true" ></LinearLayout>
        </HorizontalScrollView>
    </RelativeLayout>
<RelativeLayout
    android:id="@+id/rlBottom"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@color/xxx_black2"
    android:layout_alignParentBottom="true" >
    <TextView
        android:id="@+id/tvShotAgain"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:layout_marginLeft="10dp"
        android:text="@string/shot_again"
        android:gravity="center"
        android:textSize="@dimen/button_textsize"
        android:textColor="@color/xxxx_album_btn_text_color" />
    <ImageView
        android:id="@+id/ivOk"
        android:layout_centerInParent="true"
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:background="@drawable/xxx_btn_bg"
        android:src="@drawable/done"
        android:scaleType="center" />
</RelativeLayout>
</RelativeLayout>

============解决方案1============

 public Matrix getMatrix()
=>
 public Matrix mgetMatrix()

转载于:https://www.cnblogs.com/llj1985522/p/4091472.html

你可能感兴趣的文章
【BZOJ 1050】1050: [HAOI2006]旅行comf (动态SPFA)
查看>>
Handler.sendMessage 与 Handler.obtainMessage.sendToTarget比较
查看>>
(翻译)从底层了解ASP.NET体系结构 [转]
查看>>
IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET
查看>>
UVa 10129 - Play on Words (欧拉回路, DFS)
查看>>
Android Studio 创建/打开项目时一直处于Building“project name”Gradle project info 的解决...
查看>>
Android ViewPager使用详解
查看>>
【转】C# 过滤HTML,脚本,数据库关键字,特殊字符
查看>>
iATKOS v7硬盘安装教程(硬盘助手+变色龙安装版)
查看>>
Android连接数据库的问题
查看>>
A Story of One Country (Hard) CodeForces - 1181E2 (分治)
查看>>
Android使用本地广播
查看>>
python 删除大表数据
查看>>
【CC评网】2013.第44周 把握每天的第一个小时
查看>>
高效的使用STL
查看>>
用Perl编写Apache模块续 - SVNAuth
查看>>
mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
查看>>
tips to understand kexec
查看>>
mybatis入门
查看>>
分层图最短路【bzoj2763】: [JLOI2011]飞行路线
查看>>