【Android开发--新手必看篇】Drawable类的使用

    技术2022-08-01  84

    Android笔记

    ​ ——自定义缩放控件 【若对该知识点有更多想了解的,欢迎私信博主~~】

    Drawable类的介绍:https://blog.csdn.net/feather_wch/article/details/79124608
    Math类的介绍:https://blog.csdn.net/a22422931/article/details/52129417
    制作:
    package com.example.sirl.daypractice.T1; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.support.v7.widget.AppCompatImageView; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import java.util.Calendar; public class MyView2 extends AppCompatImageView { private Drawable drawable;//画笔 private double old = 0; private float x = 1.0f, y = 1.0f; private float downx, downy; private float movex = 1.0f, movey = 1.0f; int state = 0;//点击次数 Long time;//点击事件(用于判断双击) //重写构造函数 public MyView2(Context context, AttributeSet attrs) { super(context, attrs); drawable = getDrawable();//获取画笔 } //制作控件 @Override protected void onDraw(Canvas canvas) { //画布大小(X轴放大比例,Y轴放大比例,中心点横坐标,中心点纵坐标) canvas.scale(x, y, getWidth() / 2, getHeight() / 2); //画布当前位置(X轴偏移量,Y轴偏移量) canvas.translate(movex, movey); //保存画布 canvas.save(); super.onDraw(canvas); } //触摸事件 @Override public boolean onTouchEvent(MotionEvent event) { //获取当前日期(用于判断双击) Calendar calendar = Calendar.getInstance(); //如果触摸点为1个(双击放大和移动画布) if (event.getPointerCount() == 1) { //如果为按下事件 if (event.getAction() == event.ACTION_DOWN) { downx = event.getX() - movex; downy = event.getY() - movey; //状态为0时 if (state == 0) { state = 1; time = calendar.getTime().getTime();//第一次纪录时间 } //状态为1时 else if (state == 1) { //如果第二次点击时间与第一次小于0.3s,则为双击 if (calendar.getTime().getTime() - time < 300) { x = 2.0f;//横向放大2倍 y = 2.0f;//纵向放大2倍 state = 2; invalidate();//更新画布 } //如果时间大于0.3s,则为单击 else { state = 0; } } //状态为2时(用于双击放大后仍可以移动) else if (state==2){ state=3; } } //如果为移动事件 else if (event.getAction() == event.ACTION_MOVE) { movex = event.getX() - downx; movey = event.getY() - downy; invalidate(); } //如果为松开事件 else if (event.getAction() == event.ACTION_UP) { //取消双击放大 if (state == 3) { x = 1.0f; y = 1.0f; state = 0; invalidate(); } } } //双指方法 else if (event.getPointerCount() > 1) { float x0 = event.getX(0);//手指1的横坐标 float x1 = event.getX(1);//手指2的横坐标 float y0 = event.getY(0);//手指1的纵坐标 float y1 = event.getY(1);//手指2的纵坐标 double news = Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));//当前双指距离 //如果双指移动 if (event.getAction() == event.ACTION_MOVE) { //如果当前距离大于曾经距离并且放大比例小于4倍 if (news > old && x < 4) { x += 0.01; y += 0.01; } //如果当前距离小于曾经距离并且缩小比例大于4倍 else if (news < old && x > 0.05) { x -= 0.01; y -= 0.01; } //更新画布 invalidate(); } //松开后纪录双指距离,用于下次判断 old = news; } return true; } }
    使用:
    1.在Activity里直接布局
    <?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.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" android:orientation="vertical" tools:context=".work7.Main7Activity"> <com.example.sirl.demo0711.work7.MyView android:id="@+id/mv" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
    2.因为该控件继承ImageView,直接放入图片即可
    public class Main7Activity extends AppCompatActivity { MyView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main7); myView=findViewById(R.id.mv); myView.setImageResource(R.mipmap.ic_launcher); } }
    Processed: 0.009, SQL: 9