安卓开发:原创真正可以点击移动缩放的ImageView类(Kotlin语言)

class XGQImageView : AppCompatImageView {

    public  var  enableMove=true    //移动开关
    public  var  enableScale=false  //缩放开关


    private var mode = 0
    private val MODE_NONE = -1
    private val MODE_TRANSLATION = 0
    private val MODE_SCALE = 1

    private var move_oldx = 0f
    private var move_oldy = 0f

    private var move_newx = 0f
    private var move_newy = 0f

    private var scale_oldx1 = 0f
    private var scale_oldx2 = 0f
    private var scale_oldy1= 0f
    private var scale_oldy2= 0f

    private var scale_newx1= 0f
    private var scale_newx2= 0f
    private var scale_newy1= 0f
    private var scale_newy2= 0f



    constructor(context: Context?) : super(context!!)

    constructor(context: Context?, attrs: AttributeSet?) : super(
        context!!, attrs
    )

    override fun onTouchEvent(event: MotionEvent): Boolean {
        when (event.action and MotionEvent.ACTION_MASK) {
            MotionEvent.ACTION_DOWN -> {
                move_oldx=event.x
                move_oldy=event.y
            }
            MotionEvent.ACTION_MOVE -> {
                if(event.pointerCount==1){
                    mode = MODE_TRANSLATION
                    move_newx=event.x
                    move_newy=event.y
                    if (enableMove)
                         move()
                }else{
                    mode = MODE_SCALE
                    newXY(event)
                    if (enableScale)
                          move()
                }
            }
            MotionEvent.ACTION_POINTER_DOWN -> {
                mode = MODE_SCALE
                oldXY(event)
            }
            MotionEvent.ACTION_POINTER_UP -> {
               // saveXY()
            }
             MotionEvent.ACTION_UP -> {}
        }
        return super.onTouchEvent(event)  //不要直接返回true false 不然无法响应点击
    }

    private fun move() {
        when (mode) {
            MODE_TRANSLATION -> {
                val dx = (move_newx- move_oldx).toInt()
                val dy = (move_newy- move_oldy).toInt()
                val l = (left + dx)
                //在父控件中的右边位置 = 在左边的位置 + 自己的宽
                val r = l + width
                val t = (top + dy)
                val b = t + height
                //当水平或者垂直滑动距离大于10,才算拖动事件
                if (abs(dy) > 10 || abs(dx) > 10) {
                    this.layout(l, t, r, b)
                }

            }
            MODE_SCALE -> {
                //缩放
                val xs=(scale_newx2-scale_newx1)/(scale_oldx2 - scale_oldx1)
                val ys=(scale_newy2-scale_newy1)/(scale_oldy2 - scale_oldy1)
                if ((xs in 0.5f..5f)){
                    scaleX=xs
                }
                if ((ys in 0.5f..5f)){
                    scaleY=ys
                }

            }
        }
        mode=MODE_NONE
    }


    fun oldXY(event: MotionEvent)  {
        scale_oldx1 = event.getX(0)
        scale_oldx2 = event.getX(event.pointerCount -1)
        scale_oldy1 = event.getY(0)
        scale_oldy2  = event.getY(event.pointerCount -1)
    }
    fun newXY(event: MotionEvent)  {
        scale_newx1 = event.getX(0)
        scale_newx2 = event.getX(event.pointerCount -1)
        scale_newy1 = event.getY(0)
        scale_newy2  = event.getY(event.pointerCount -1)
    }


}

使用

val view3= XGQImageView(mLayout.context).apply {
    visibility=View.INVISIBLE
    id=mNewID++
    layoutParams = ConstraintLayout.LayoutParams(mWidth,mHeight).apply {

       // startToStart = mID
        topToTop =  view1.id
        endToEnd = view1.id
        //bottomToBottom = mID

       // leftMargin  =mViewMargins[2][0]
        topMargin   =mViewMargins[2][1]
        rightMargin =mViewMargins[2][2]
        //bottomMargin=mViewMargins[2][3]

        scaleType= ImageView.ScaleType.FIT_XY
        width= mViewSizes[2][0]
        height=mViewSizes[2][1]

        alpha=0.4F

    }
    setImageDrawable(mImages[2])
    mLayout.addView(this)
    enableMove=true
    enableScale=true
    visibility=View.VISIBLE
}
 
view3.setOnClickListener {
        _ ->
    mAnimate0(view3)
    animate1()
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值