/storage/emulated/0/AppProjects/Tusegj/app/src/main/ AndroidManifest.xml
/storage/emulated/0/AppProjects/Tusegj/app/src/main/java/com/tsgj/ts/ MainActivity.java
package com.tsgj.ts;
import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import android.graphics.*;
import android.view.View.*;
import android.view.*;
import android.content.*;
import android.net.*;
import android.util.*;
import android.provider.*;
import android.database.*;
import java.io.*;
import android.webkit.*;
import android.os.*;
import androidx.appcompat.app.*;
import androidx.core.app.*;
import android.content.pm.*;
public class MainActivity extends AppCompatActivity
{
private ClockView hb;
private Button openImageBn; //打开图片
private Bitmap img; //原始图片
private TextView pathText; //路径TextView
private String path; //存储图片路径
private ImageView imageShow; //显示图片
private final int IMAGE_CODE = 0; //打开图片
//触屏缩放图片
private static final int NONE = 0; //初始状态
private static final int DRAG = 1; //拖动
private static final int ZOOM = 2; //缩放
private int mode = NONE; //当前事件
private float oldDist;
private PointF startPoint = new PointF();
private PointF middlePoint = new PointF();
private Matrix matrix = new Matrix();
private Matrix savedMatrix = new Matrix();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sqqx(this);
openImageBn = findViewById(R.id.button1);
pathText = findViewById(R.id.textView1);
hb = findViewById(R.id.hb);
//打开图片
openImageBn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, IMAGE_CODE);
}
});
//触屏缩放图片监听 注:XML中修改android:scaleType="matrix"
hb.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN: //手指按下
savedMatrix.set(matrix);
startPoint.set(event.getX(), event.getY());
mode = DRAG;
break;
case MotionEvent.ACTION_UP:
pathText.setText(middlePoint+"\n"+startPoint+"\n"+matrix+"\n缩放 "+ZOOM+"\n拖动 "+DRAG);
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event); //如果两点距离大于10 多点模式
if (oldDist > 10f)
{
savedMatrix.set(matrix);
midPoint(middlePoint, event);
mode = ZOOM;
}
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG)
{ //拖动
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - startPoint.x, event.getY() - startPoint.y);
}
else if (mode == ZOOM)
{ //缩放
float newDist = spacing(event);
if (newDist > 10f)
{
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, middlePoint.x, middlePoint.y);
}
}
break;
}
hb.aa(matrix);
hb.onClick(hb);
return true;
}
//两点距离
private float spacing(MotionEvent event)
{
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return (x * x + y * y);
}
//两点中点
private void midPoint(PointF point, MotionEvent event)
{
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
});
}
//监听是否是当前界面 获取图片路径
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == IMAGE_CODE)
{
Uri imageFileUri = data.getData();
//显示文件路径
String[] filePathColumn= {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(imageFileUri, filePathColumn, null, null, null);
cursor.moveToFirst(); //将光标移至开头
int columnIndex = cursor.getColumnIndex(filePathColumn[0]); //获得用户选择图片的索引
path = cursor.getString(columnIndex);
cursor.close();
//获取路径图片
dutupian(path);
//传递图片到画布
hb.aa(img);
//更新画布
hb.onClick(hb);
}
}
public void dutupian(String pathString)
{
File file = new File(pathString);
Bitmap bitmap=null;
if (file.exists())
{
bitmap = BitmapFactory.decodeFile(pathString);
}
img=bitmap;
}
//申请存储权限
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE" };
public static void sqqx(Activity activity)
{
try
{
//检测是否有写的权限
int permission = ActivityCompat.checkSelfPermission(activity, "android.permission.WRITE_EXTERNAL_STORAGE");
if (permission != PackageManager.PERMISSION_GRANTED)
{
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/storage/emulated/0/AppProjects/Tusegj/app/src/main/java/com/tsgj/ts/ ClockView.java
package com.tsgj.ts;
import android.view.*;
import android.view.View.*;
import android.graphics.*;
import android.content.*;
import android.util.*;
public class ClockView extends View implements OnClickListener {
private Paint mPaint;
private Matrix matrix = new Matrix();
private Rect mBounds;
private Bitmap img;
private int mCount;
private int sz=1;
public ClockView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBounds = new Rect();
setOnClickListener(this);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.BLUE);
canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
mPaint.setColor(Color.YELLOW);
mPaint.setTextSize(30);
String text = String.valueOf(mCount);
mPaint.getTextBounds(text, 0, text.length(), mBounds);
float textWidth = mBounds.width();
float textHeight = mBounds.height();
canvas.drawText(text, getWidth() / 2 - textWidth / 2, getHeight() / 2
+ textHeight / 2, mPaint);
canvas.setMatrix(matrix);
if(img!=null){
canvas.drawBitmap(img,0,0,mPaint);
}
canvas.setMatrix(new Matrix());
}
@Override
public void onClick(View v) {
mCount+=sz;
invalidate();
}
public void aa(int a){
sz=a;
}
public void aa(Bitmap a){
img=a;
}
public void aa(Matrix a){
matrix=a;
}
}
QQ群 647162429
