【问题标题】:Zoom on bitmap image canvas with gesture android使用手势 android 放大位图图像画布
【发布时间】:2013-11-29 05:05:36
【问题描述】:

我使用https://github.com/harism/android_page_curl 上的 harism curl 页面库加载了一组位图图像。我需要在每个位图图像上集成缩放和手势。如何通过手势实现缩放。谁能帮助我这是我几天来面临的核心问题。

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        lp = this;
        util = new Utils();
        if (getLastNonConfigurationInstance() != null) {
            index = (Integer) getLastNonConfigurationInstance();
        }
        mCurlView = (CurlView) findViewById(R.id.curl);
        mCurlView.setPageProvider(new PageProvider());
        mCurlView.setSizeChangedObserver(new SizeChangedObserver());
        mCurlView.setCurrentIndex(index);
        //  mCurlView.setBackgroundResource(R.drawable.icon);
        imHome = (ImageView)findViewById(R.id.imHome);
        imHome.setClickable(true);
        imHome.setOnClickListener(lp);
        btOne=(Button)findViewById(R.id.btOne);
        btTwo=(Button)findViewById(R.id.btTwo);
        btThree=(Button)findViewById(R.id.btThree);
        btFour=(Button)findViewById(R.id.btFour);
        llPageOne = (LinearLayout)findViewById(R.id.llPageOne);
        btOne.setOnClickListener(this);
        btTwo.setOnClickListener(this);
        btThree.setOnClickListener(this);
        btFour.setOnClickListener(this);
        // This is something somewhat experimental. Before uncommenting next
        // line, please see method comments in CurlView.
        // mCurlView.setEnableTouchPressure(true);
    }
    @Override
    public void onPause() {
        super.onPause();
        mCurlView.onPause();
    }
    @Override
    public void onResume() {
        super.onResume();
        mCurlView.onResume();
    }
    @Override
    public Object onRetainNonConfigurationInstance() {
        return mCurlView.getCurrentIndex();
    }
    /**
     * Bitmap provider.
     */
    private class PageProvider implements CurlView.PageProvider {
        // Bitmap resources.
        private int[] mBitmapIds = {
                R.drawable.luxury,R.drawable.luxury1,R.drawable.luxury_two
        };
        @Override
        public int getPageCount() {
            //return 5;
            int pagesCount = 0;
            DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
            int wwidth = displaymetrics.widthPixels;
            int hheight = displaymetrics.heightPixels;
            if(wwidth > hheight){
                if((mBitmapIds.length % 2) > 0)
                    pagesCount = (mBitmapIds.length / 2) + 1;
                else
                    pagesCount = mBitmapIds.length / 2;
            }else{
                pagesCount = mBitmapIds.length;
            }
            System.out.println("page count "+pagesCount);
            return pagesCount;
        }
        private Bitmap loadBitmap(int width, int height, int index) {
            Bitmap b = Bitmap.createBitmap(width, height,
                    Bitmap.Config.ARGB_8888);
            b.eraseColor(0xFFFFFFFF);
            Canvas c = new Canvas(b);
            Drawable d = getResources().getDrawable(mBitmapIds[index]);
            System.out.println("canvas width: "+c.getWidth());
            int margin = 3;//7
            int border = 3;//2
            Rect r = new Rect(margin, margin, width - margin, height - margin);
            int imageWidth = r.width() - (border * 2);
            int imageHeight = imageWidth * d.getIntrinsicHeight()
                    / d.getIntrinsicWidth();
            if (imageHeight > r.height() - (border * 2)) {
                imageHeight = r.height() - (border * 2);
                imageWidth = imageHeight * d.getIntrinsicWidth()
                        / d.getIntrinsicHeight();
            }
            Log.d("TAG", String.valueOf(imageHeight));
            if (lp.getWindow().getWindowManager().getDefaultDisplay()
                    .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
                // portrait mode
                r.left += ((r.width() - imageWidth) / 2) - border;
                r.right = r.left + imageWidth + border + border;
            } else if (lp.getWindow().getWindowManager().getDefaultDisplay()
                    .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
                // landscape
                r.left += ((r.width() - imageWidth)) - border-122;
                r.right = r.left + imageWidth + border + border+122;
            }
            r.top += ((r.height() - imageHeight) / 2) - border;
            r.bottom = r.top + imageHeight + border + border;
            Paint p = new Paint();
            p.setColor(0xFFC0C0C0);
            c.drawRect(r, p);
            r.left += border;
            r.right -= border;
            r.top += border;
            r.bottom -= border;
            d.setBounds(r);
            d.draw(c);
            return b;
        }
        @Override
        public void updatePage(CurlPage page, int width, int height, int index) {
            DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
            int wwidth = displaymetrics.widthPixels;
            int hheight = displaymetrics.heightPixels;
            if(wwidth > hheight){
                System.out.println("index "+(index*2));
                System.out.println("index2 "+(index*2)+1);
                System.out.println("case landscape orientation...");
                if (index >0){
                    front = loadBitmap(width, height, (index*2));
                    back = loadBitmap(width, height, (index*2)+1);
                }else {
                    front = loadBitmap(width, height, (index));
                    back = loadBitmap(width, height, (index));
                }
                System.out.println( "MyActivity.onCreate debug message "+String.valueOf(index));
                Matrix matrix = new Matrix(); 
                matrix.preScale(-1.0f, 1.0f); 
                Bitmap mirroredBitmap = Bitmap.createBitmap(back, 0, 0, back.getWidth(), back.getHeight(), matrix, false);
                page.setTexture(front, CurlPage.SIDE_FRONT);
                page.setTexture(mirroredBitmap, CurlPage.SIDE_BACK);
                //              if (mCurlView.getCurrentIndex()==0){
                //
                //                  showPage1();
                //
                //              }else {
                //
                //                  hidePage1();
                //              }
                System.out.println("mCurlView.getCurrentIndex() "+mCurlView.getCurrentIndex());
            }else{
                System.out.println("case portrait orientation...");
                Bitmap front = loadBitmap(width, height, index);
                Bitmap back = loadBitmap(width, height, index);
                System.out.println( "MyActivity.onCreate debug message "+String.valueOf(index));
                page.setTexture(front, CurlPage.SIDE_FRONT);
                page.setTexture(back, CurlPage.SIDE_BACK);
            }
        }
    }
    /**
     * CurlView size changed observer.
     */
    private class SizeChangedObserver implements CurlView.SizeChangedObserver {
        @Override
        public void onSizeChanged(int w, int h) {
            if (w > h) {
                mCurlView.setViewMode(CurlView.SHOW_TWO_PAGES);
                mCurlView.setMargins(.000f, .000f, .000f, .000f);
            } else {
                mCurlView.setViewMode(CurlView.SHOW_ONE_PAGE);
                mCurlView.setMargins(.005f, .005f, .00f, .00f);
            }
        }
    }
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch(v.getId()){
        case R.id.btOne:
            util.sendUri(this, "http://google.com/");
            break;
        case R.id.btTwo:
            util.sendUri(this, "http://google.com/");
            break;
        case R.id.btThree:
            util.sendUri(this, "http://google.com/");
            break;
        case R.id.btFour:
            util.sendUri(this, "http://google.com/");
            break;
        case R.id.imHome:
            mCurlView.setCurrentIndex(0);
            System.out.println("home pressed");
            mCurlView.onResume();
            break;
        }
    }
    public void showPage1(){
        llPageOne.setVisibility(View.VISIBLE);
    }
    public void hidePage1(){
        llPageOne.setVisibility(View.GONE);
    }
    //  @Override
    //  public void onBackPressed() {
    //      // TODO Auto-generated method stub
    //
    //      startActivity (new Intent (this,MyActivityMenuActivity.class));
    //  }
    //  
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.drop_list, menu);
        return super.onCreateOptionsMenu(menu);
    }
    /**
     * Override function onOptionsItemSelected(MenuItem item)
     * Identify the item
     * Call super class's onOptionsItemSelected(MenuItem item)
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId()==R.id.menu_option_one){
            startActivity (new Intent (this,ContactForm.class));
        }
        return super.onOptionsItemSelected(item);
    }

【问题讨论】:

    标签: android


    【解决方案1】:

    覆盖onTouchEvent(MotionEvent event) 并创建ScaleGestureDetector.OnScaleGestureListener 的实例以检测缩放事件。比根据缩放比例绘制位图

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 2011-06-22
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多