如何移动与触摸指针对应的Image(在Imageview内)?

时间:2017-02-15 19:41:26

标签: android android-imageview geometry ontouchlistener

我是在Android上构建应用的新手。我有Java和android工作室的工作经验,并构建基本的Android应用程序,但我现在正在研究的项目有点复杂。

我想在与触摸指针对应的图像视图内移动图像,换句话说,移动到触摸方向但在特定区域(圆形)内。 就像在android app pou中一样,pou眼睛移动对应于触摸指针。

我从下面的代码开始:

public class TouchActivity extends Activity {

    private ViewGroup mainLayout;
    private ImageView image;

    private int xDelta;
    private int yDelta;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_touch);
        mainLayout = (RelativeLayout) findViewById(R.id.main);
        image = (ImageView) findViewById(R.id.image);

        image.setOnTouchListener(onTouchListener());
    }

    private OnTouchListener onTouchListener() {
        return new OnTouchListener() {

            @SuppressLint("ClickableViewAccessibility")
            @Override
            public boolean onTouch(View view, MotionEvent event) {

                final int x = (int) event.getRawX();
                final int y = (int) event.getRawY();

                switch (event.getAction() & MotionEvent.ACTION_MASK) {

                case MotionEvent.ACTION_DOWN:
                    RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) 
                    view.getLayoutParams();

                    xDelta = x - lParams.leftMargin;
                    yDelta = y - lParams.topMargin;
                    break;

                case MotionEvent.ACTION_UP:
                    Toast.makeText(TouchActivity.this,
                            "thanks for new location!", Toast.LENGTH_SHORT)
                            .show();
                    break;

                case MotionEvent.ACTION_MOVE:
                    RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
                            .getLayoutParams();
                    layoutParams.leftMargin = x - xDelta;
                    layoutParams.topMargin = y - yDelta;
                    layoutParams.rightMargin = 0;
                    layoutParams.bottomMargin = 0;
                    view.setLayoutParams(layoutParams);
                    break;
                }
                mainLayout.invalidate();
                return true;
            }
        };
    }
}

...并成功设法移动与触摸指针对应的图像,但我想实现这样的事情: (eyes are moving according to touch but inside a specific area)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

(由kalu提出)将点击图片在imageview内移动一定高度或根据资源(图片)的大小移动x或y方向。

尝试一下:

                   // your image view

                   ImageView mCoverView = findViewById(R.id.imageview);


                    Glide.with(aActivity).load(cover) //set img url  
                            .asBitmap()
                            .diskCacheStrategy(DiskCacheStrategy.ALL)
                            .into(new BitmapImageViewTarget(mCoverView) {
                                @Override
                                protected void setResource(Bitmap resource) {
                                final  Bitmap f_res = resource;

                           //  just if you want change for a drawable res
                           //  final  Bitmap f_res = BitmapFactory.decodeResource(aActivity.getResources(),R.drawable.ic_ampliada);

                                    //k ajust center but ajust height or with depend the image
                                    mCoverView.setScaleType(ImageView.ScaleType.CENTER_CROP);

                                    mCoverView.setImageBitmap(f_res);

                                    final String  dir;
                                    if(f_res.getWidth()>f_res.getHeight())
                                        dir="x";
                                    else
                                        dir="y";

                                    mCoverView.setOnClickListener(new View.OnClickListener() {

                                        // size of move
                                        int value = 25;



                                        double resh=f_res.getHeight();
                                        double resw=f_res.getWidth();

                                        double coverh =mCoverView.getHeight();
                                        double coverw = mCoverView.getWidth();


                                        int xTranslate = 0;
                                        double sacale_w_from_h = coverh / resh * resw;
                                        //k wtotal distancia do centro as bordas (x=0 (centro imagem))
                                        double wtotal = (sacale_w_from_h/2);



                                        int yTranslate = 0;

                                        double sacale_h_from_w = coverw / resw * resh;
                                        //k wtotal distancia do centro as bordas (y=0 (centro imagem))
                                        double htotal = sacale_h_from_w / 2;


                                        @Override
                                        public void onClick(View v) {


                                            if (dir == "x"){
                                                if (xTranslate>wtotal || xTranslate<-wtotal)
                                                    value=-value;

                                                xTranslate += value;
                                            }else if(dir == "y"){

                                                if (yTranslate>htotal || yTranslate<-htotal)
                                                    value=-value;

                                                yTranslate += value;
                                            }



                                            this.translateImage(xTranslate,yTranslate);
                                        }

                                        private void translateImage(int xTranslate, int yTranslate)
                                        {
                                            Bitmap translateBitmap = Bitmap.createBitmap(f_res.getWidth() + xTranslate, f_res.getHeight() + yTranslate, f_res.getConfig());
                                            Canvas translateCanvas = new Canvas(translateBitmap);
                                            Matrix translateMatrix = new Matrix();
                                            translateMatrix.setTranslate(xTranslate, yTranslate);

                                            Paint paint = new Paint();
                                            translateCanvas.drawBitmap(f_res, translateMatrix, paint);

                                            mCoverView.setImageBitmap(translateBitmap);
                                        }

                                    });


                                }
                                @Override
                                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                                    if (glideAnimation == null || !glideAnimation.animate(resource, this)) {
                                        setResource(resource);
                                    }
                                }
                            });

// --------------------------------------------- ----------------------