问题D3平滑放大地球上的点击图

时间:2016-07-15 11:47:41

标签: animation d3.js svg zoom webgl-globe

我创建了D3 globe。 我陷入困境,现在点击情节,地图放大但不顺利放大。 我需要通过平滑过渡放大地图。 http://projectsdemo.net/globe/v4/

public void onCreate(Bundle savedInstanceState) {
    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            AAA asyncTask = new AAA();
            try {
                ((AAA) asyncTask).execute(null, null, null,null).get();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
}
public class AAA extends AsyncTask<Object, String, Object> {
    private ProgressDialog progDailog = null;


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progDailog = new ProgressDialog(ViewTestActivity.this);
        progDailog.setMessage("Loading...");
        progDailog.setIndeterminate(false);
        progDailog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progDailog.setCancelable(true);
        progDailog.show();
    }

    @Override
    protected Object doInBackground(Object... params) {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return params;
    }

    @Override
    protected void onPostExecute(Object result) {
        progDailog.dismiss();
    }
}

1 个答案:

答案 0 :(得分:0)

因为这个原因,你的轮播正在转变:

.rotate(r(t))

其中r是插值函数,t是转换中的当前步骤。它看起来像你的规模:

.scale(Math.max(minScale, Math.min(maxScale, k)))

只是在转换的每一步都设置为相同的值。

您需要为比例设置单独的插值函数:

var r = d3.interpolate(projection.rotate(), [-centroid[0], -centroid[1], 0]),
    r2 = d3.interpolate(project.scale(), Math.max(minScale, Math.min(maxScale, k)));

然后,在转换过程中使用它:

projection.rotate(r(t))
  .scale(r2(t))
  ...